一、簡介
syslog是一種工業標准的協議,可用來記錄設備的日志。在UNIX系統,路由器、交換機等網絡設備中,系統日志(System Log)記錄系統中任何時間發生的大小事件。管理者可以通過查看系統記錄,隨時掌握系統狀況。UNIX的系統日志是通過syslogd這個進程記錄系統有關事件記錄,也可以記錄應用程序運作事件。通過適當的配置,我們還可以實現運行syslog協議的機器間通信,通過分析這些網絡行為日志,藉以追蹤掌握與設備和網絡有關的狀況。
二、進程與配置
守護進程:/etc/syslogd,該程序在啟動時查詢配置文件。
在客戶端/服務器架構的配置下,rsyslog同時扮演了兩種角色:
1)作為一個syslog服務器,rsyslog可以收集來自其他設施的日志信息;
2)作為一個syslog客戶端,rsyslog可以將其內部的日志信息傳輸到遠程的syslog服務器。
配置文件:/etc/syslog.conf,指明了syslogd守護程序記錄日志的行為,可以對生成的日志的位置及其相關信息進行靈活的配置。
配置文件由不同程序或消息分類的單個條目組成,每個條目有一個選擇域(由消息類型和優先級組成,指明消息的類型和優先級)和一個動作域(指明所要執行的動作),域間由tab分隔:
另外,允許通過三種限定符對優先級進行修飾:星號(*)、等號(=)和嘆號(!)
1)星號(*)的含義是把本項服務生成的所有日志消息都發送到操作動作指定的地點。就像它在規則表達式里的作用一樣,星號代表“任何東西”。在前面給出的例子里,“mail.*”將把所有優先級的消息都發送到操作動作指定的/var/log/mail文件里。使用“*”限定符與使用“debug”優先級的效果完全一樣,后者也將把所有類型的消息發送到指定地點。 2)等號(=)的含義是只把本項服務生成的本優先級的日志消息都發送到操作動作指定的地點。比如說,可以用“=”限定符只發送調試消息而不發送其他更緊急的消息(這將為應用程序減輕很多負擔)。當你只需要發送特定優先級別的消息時,就要使用等號限定符。 3)嘆號(!)的含義是把本項服務生成的所有日志消息都發送到操作動作指定的地點,但本優先級的消息不包括在內。
三、syslog協議
RFC3164描述了syslog協議,協議建議:
1)規定syslog消息的UDP報文不能超過1024字節,並且全部由可打印的字符組成。 2)完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒有。 3)syslog消息發送到Collector的UDP 514端口,不需要接收方應答,RFC3164建議 Device 也使用514作為源端口。 4)約定發送syslog的設備為Device,轉發syslog的設備為Relay,接收syslog的設備為Collector。 Relay本身也可以發送自身的syslog給Collector,這個時候它表現為一個Device。Relay也可以只轉發部分接收到的syslog消息,這個時候它同時表現為Relay和Collector。
四、syslog協議解析
syslog消息實例:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
1)PRI部分
PRI部分由尖括號包含的一個數字構成,這個數字包含了程序模塊(Facility)、嚴重性(Severity),這個數字是由Facility乘以 8,然后加上Severity得來,也就是說這個數字如果換成2進制的話,低位的3個bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。
Facility的定義如下,可以看出來syslog的Facility是早期為Unix操作系統定義的,不過它預留了User(1),Local0~7 (16~23)給其他程序使用: Numerical Facility Code 0 kernel messages 1 user-level messages 2 mail system 3 system daemons 4 security/authorization messages (note 1) 5 messages generated internally by syslogd 6 line printer subsystem 7 network news subsystem 8 UUCP subsystem 9 clock daemon (note 2) 10 security/authorization messages (note 1) 11 FTP daemon 12 NTP subsystem 13 log audit (note 1) 14 log alert (note 1) 15 clock daemon (note 2) 16 local use 0 (local0) 17 local use 1 (local1) 18 local use 2 (local2) 19 local use 3 (local3) 20 local use 4 (local4) 21 local use 5 (local5) 22 local use 6 (local6) 23 local use 7 (local7) Note 1 - Various operating systems have been found to utilize Facilities 4, 10, 13 and 14 for security/authorization, audit, and alert messages which seem to be similar. Note 2 - Various operating systems have been found to utilize both Facilities 9 and 15 for clock (cron/at) messages.
Severity的定義如下,尖括號中有1~3個數字字符,只有當數字是0的時候,數字才以0開頭,也就是說00和01這樣在前面補0是不允許的。 Numerical Severity Code 0 Emergency: system is unusable 1 Alert: action must be taken immediately 2 Critical: critical conditions 3 Error: error conditions 4 Warning: warning conditions 5 Notice: normal but significant condition 6 Informational: informational messages 7 Debug: debug-level messages
2)HEADER部分
HEADER部分包括兩個字段,時間和主機名(或IP)。
1)時間緊跟在PRI后面,中間沒有空格,格式必須是“Mmm dd hh:mm:ss”,不包括年份。“日”的數字如果是1~9,前面會補一個空格(也就是月份后面有兩個空格),而“小時”、“分”、“秒”則在前面補“0”。月份取值包括:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 2)時間后邊跟一個空格,然后是主機名或者IP地址,主機名不得包括域名部分。
3)MSG部分
HEADER部分后面跟一個空格,然后是MSG部分,有些syslog中沒有HEADER部分。這個時候MSG部分緊跟在PRI后面,中間沒有空格。MSG部分又分為兩個部分,TAG和Content。其中TAG部分是可選的。
在前面的例子中(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.”),“auditd[1787]”是TAG部分,包含了進程名稱和進程PID。
PID可以沒有,這個時候中括號也是沒有的。進程PID有時甚至不是一個數字,例如“root-1787”,解析程序要做好容錯准備。
TAG后面用一個冒號隔開Content部分,這部分的內容是應用程序自定義的。
五、API
在Linux中,提供了四個有關syslog日志系統的系統調用,供用戶使用:
openlog:打開日志設備,以供讀取和寫入,與文件系統調用的open類似;
syslog:寫入日志,與文件系統調用的write類似;
closelog:關閉日志設備,與文件系統調用的close類似;
vsyslog:它和syslog功能一樣,負責寫入日志,只是參數格式不同。
六、其他
1)在Linux上配置一個syslog服務器