Syslog已被許多日誌函數採納,它用在許多保護措施中——任何程序均可以經過syslog 紀錄事件。Syslog能夠紀錄系統事件,能夠寫到一個文件或設備中,或給用戶發送一個信息。它能紀錄本地事件或經過網絡紀錄另外一個主機上的事件。linux
Syslog設備依據兩個重要的文件:/etc/syslogd(守護進程)和/etc/syslog.conf配置文件,習慣上,多數syslog信息被寫到/var/adm或/var/log目錄下的信息文件中(messages.*)。一個典型的syslog紀錄包括生成程序的名字和一個文本信息。它還包括一個設備和一個優先級範圍(但不在日之中出現)。
每一個syslog消息被賦予下面的主要設備之一: shell
LOG_AUTH——認證系統:login、su、getty等 LOG_AUTHPRIV——同LOG_AUTH,但只登陸到所選擇的單個用戶可讀的文件中 LOG_CRON——cron守護進程 LOG_DAEMON——其餘系統守護進程,如routed LOG_FTP——文件傳輸協議:ftpd、tftpd LOG_KERN——內核產生的消息 LOG_LPR——系統打印機緩衝池:lpr、lpd LOG_MAIL——電子郵件系統 LOG_NEWS——網絡新聞系統 LOG_SYSLOG——由syslogd(8)產生的內部消息 LOG_USER——隨機用戶進程產生的消息 LOG_UUCP——UUCP子系統 LOG_LOCAL0~LOG_LOCAL7——爲本地使用保留 Syslog爲每一個事件賦予幾個不一樣的優先級: LOG_EMERG——緊急狀況 LOG_ALERT——應該被當即改正的問題,如系統數據庫破壞 LOG_CRIT——重要狀況,如硬盤錯誤 LOG_ERR——錯誤 LOG_WARNING——警告信息 LOG_NOTICE——不是錯誤狀況,可是可能須要處理 LOG_INFO——情報信息 LOG_DEBUG——包含情報的信息,一般旨在調試一個程序時使用
在命令行中輸入syslogd help
查看是否能夠執行,若是沒有,就不可用。數據庫
在最新的ubuntu和centos等系統中,以及用別的log服務替代了syslog,可是在嵌入式系統中,syslog使用較爲普遍。嵌入式系統中busybox自帶有syslog服務。編程
輸入syslogd help
後,會提示默認的配置文件。咱們要查看此文件是否存在,若是不存在咱們須要建立一個配置文件如:touch /etc/syslog.conf,同時使用syslogd -f /etc/syslog.conf來進行綁定。ubuntu
syslog.conf文件指明syslogd程序紀錄日誌的行爲,該程序在啓動時查詢配置文件。centos
若是沒有改配置文件的話,默認的會寫到 /var/log/messages 中。 安全
該文件由不一樣程序或消息分類的單個條目組成,每一個佔一行。對每類消息提供一個選擇域和一個動做域。這些域由tab隔開:選擇域指明消息的類型和優先級;動做域指明syslogd接收到一個與選擇標準相匹配的消息時所執行的動做。bash
每一個選項是由設備和優先級組成。當指明一個優先級時,syslogd將紀錄一個擁有相同或更高優先級的消息。因此若是指明"crit",那全部標爲crit、alert和emerg的消息將被紀錄。每行的行動域指明當選擇域選擇了一個給定消息後應該把他發送到哪兒。服務器
以下所示:網絡
類型.級別;類型.級別 [TAB] 動做
保留字段中的「類型」表明信息產生的源頭,能夠是:
auth 認證系統,即詢問用戶名和口令 cron 系統定時系統執行定時任務時發出的信息 daemon 某些系統的守護程序的syslog,如由in.ftpd產生的log kern 內核的syslog信息 lpr 打印機的syslog信息 mail 郵件系統的syslog信息 mark 定時發送消息的時標程序 news 新聞系統的syslog信息 user 本地用戶應用程序的syslog信息 uucp uucp子系統的syslog信息 local0..7 種本地類型的syslog信息,這些信息能夠又用戶來定義 \* 表明以上各類設備
保留字段中的「級別」表明信息的重要性,能夠是:
emerg 緊急,處於Panic狀態。一般應廣播到全部用戶; alert 告警,當前狀態必須當即進行糾正。例如,系統數據庫崩潰; crit 關鍵狀態的警告。例如,硬件故障; err 其它錯誤; warning 警告; notice 注意;非錯誤狀態的報告,但應特別處理; info 通報信息; debug 調試程序時的信息; none 一般調試程序時用,指示帶有none級別的類型產生的信息無需送出。如*.debug;mail.none表示調試時除郵件信息外其它信息都送出。
「動做」域指示信息發送的目的地。能夠是:
/filename 日誌文件。由絕對路徑指出的文件名,此文件必須事先創建; @host 遠程主機; @符號後面能夠是ip,也能夠是域名,默認在/etc/hosts文件下loghost這個別名已經指定給了本機。 user1,user2 指定用戶。若是指定用戶已登陸,那麼他們將收到信息; * 全部用戶。全部已登陸的用戶都將收到信息。
咱們來看看/etc/syslog.conf文件中的實例:
…… *.err;kern.debug;daemon.notice;mail.crit [TAB] /var/adm/messages ……
這行中的「action」就是咱們常關心的那個/var/adm/messages文件,輸出到它的信息源頭「selector」是:
例如,若是想把全部郵件消息紀錄到一個文件中,以下:
#Log all the mail messages in one place mail.* /var/log/maillog
其餘設備也有本身的日誌。UUCP和news設備能產生許多外部消息。它把這些消息存到本身的日誌(/var/log/spooler)中並把級別限爲"err"或更高。例如:
# Save mail and news errors of level err and higher in aspecial file. uucp,news.crit /var/log/spooler
當一個緊急消息到來時,可能想讓全部的用戶都獲得。也可能想讓本身的日誌接收並保存。
#Everybody gets emergency messages, plus log them on anther machine *.emerg * *.emerg @linuxaid.com.cn
alert消息應該寫到root和tiger的我的帳號中:
#Root and Tiger get alert and higher messages *.alert root,tiger
有時syslogd將產生大量的消息。例如內核("kern"設備)可能很冗長。用戶可能想把內核消息紀錄到/dev/console中。下面的例子代表內核日誌紀錄被註釋掉了:
#Log all kernel messages to the console #Logging much else clutters up the screen #kern.* /dev/console
用戶能夠在一行中指明全部的設備。下面的例子把info或更高級別的消息送到/var/log/messages,除了mail之外。級別"none"禁止一個設備:
#Log anything(except mail)of level info or higher #Don't log private authentication messages! *.info:mail.none;authpriv.none /var/log/messages
在有些狀況下,能夠把日誌送到打印機,這樣網絡入侵者怎麼修改日誌都沒有用了。一般要普遍紀錄日誌。Syslog設備是一個攻擊者的顯著目標。一個爲其餘主機維護日誌的系統對於防範服務器攻擊特別脆弱,所以要特別注意。
有個小命令logger爲syslog(3)系統日誌文件提供一個shell命令接口,使用戶能建立日誌文件中的條目。
用法:logger
例如:logger This is a test!
它將產生一個以下的syslog紀錄:Aug 19 22:22:34 tiger: This is a test!
注意不要徹底相信日誌,由於攻擊者很容易修改它的。
三個函數的原型和說明:
void openlog( char *ident, int option, int facility); void syslog( int priority, char *format, ...); void closelog( void );
priority是facility及level的組合,其後參數的用法相似printf。
option:用於openlog()的option參數能夠是如下幾個的組合:
facility:該參數用來指定何種程式在記錄訊息,這可以讓設定檔來設定何種訊息如何處理。
level:決定訊息的重要性. 如下的等級重要性逐次遞減:
#include<stdio.h> #include<stdlib.h> #include <syslog.h> #define SYSNAME "wohawoha" void Info(void) { openlog("info",LOG_PID,LOG_LOCAL5);/*注意這裏的數字5與第一條裏面提到的local5.*裏的5必須相同,而且這個數字的範圍爲0--7*/ syslog(LOG_INFO, "hello %s","woring"); } void Woring(void) { openlog("woring",LOG_PID,LOG_LOCAL5); syslog(LOG_WARNING, "hello %s","test"); } int main() { Info(); Woring(); closelog(); return 0; }
Dec 13 12:31:21 localhost info[11750]: hello woring Dec 13 12:31:21 localhost woring[11750]: hello test