关于syslog
syslog架構
Unix/Linux系統中的大部分日志都是通過一種叫做syslog的機制產生和維護的。syslog是一種標準的協議,分為客戶端和服務器端,客戶端是產生日志消息的一方,而服務器端負責接收客戶端發送來的日志消息,并做出保存到特定的日志文件中或者其他方式的處理。在Linux中,常見的syslog服務器端程序是syslogd守護程序。這個程序可以從三個地方接收日志消息:(1)Unix域套接字 /dev/log;(2)UDP端口514;(3)特殊的設備/dev/klog(讀取內核發出的消息)。相應地,產生日志消息的程序就需要通過上述三種方式寫入消息,對于大多數程序而言就是向/dev/log這個套接字發送日志消息。
關于syslog的協議
介紹?
在Unix類操作系統上,syslog廣泛應用于系統日志。syslog日志消息既可以記錄在本地文件中,也可以通過網絡發送到接收syslog的服務器。接收syslog的服務器可以對多個設備的syslog消息進行統一的存儲,或者解析其中的內容做相應的處理。常見的應用場景是網絡管理工具、安全管理系統、日志審計系統。完整的syslog日志中包含產生日志的程序模塊(Facility)、嚴重性(Severity或 Level)、時間、主機名或IP、進程名、進程ID和正文。在Unix類操作系統上,能夠按Facility和Severity的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發送到一個接收syslog的服務器等。由于syslog簡單而靈活的特性,syslog不再僅限于 Unix類主機的日志記錄,任何需要記錄和發送日志的場景,都可能會使用syslog。
長期以來,沒有一個標準來規范syslog的格式,導致syslog的格式是非常隨意的。最壞的情況下,根本就沒有任何格式,導致程序不能對syslog 消息進行解析,只能將它看作是一個字符串。
在2001年定義的RFC3164中,描述了BSD syslog協議:
http://www.ietf.org/rfc/rfc3164.txt
不過這個規范的很多內容都不是強制性的,常常是“建議”或者“約定”,也由于這個規范出的比較晚,很多設備并不遵守或不完全遵守這個規范。接下來就介紹一 下這個規范。
約定發送syslog的設備為Device,轉發syslog的設備為Relay,接收syslog的設備為Collector。Relay本身也可以發送自身的syslog給Collector,這個時候它表現為一個Device。Relay也可以只轉發部分接收到的syslog消息,這個時候它同時表現為Relay和Collector。
syslog消息發送到Collector的UDP 514端口,不需要接收方應答,RFC3164建議 Device 也使用514作為源端口。規定syslog消息的UDP報文不能超過1024字節,并且全部由可打印的字符組成。完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒有。
syslog的格式?
下面是一個syslog消息:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。
PRI部分?
PRI部分由尖括號包含的一個數字構成,這個數字包含了程序模塊(Facility)、嚴重性(Severity),這個數字是由Facility乘以 8,然后加上Severity得來。不知道他們為什么發明了這么一種不直觀的表示方式。也就是說這個數字如果換成2進制的話,低位的3個bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。
十進制30 = 二進制0001 1110
0001 1... = Facility: DAEMON - system daemons (3)
.... .110 = Severity: INFO - informational (6)
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的定義如下:
? ? ? ?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
也就是說,尖括號中有1~3個數字字符,只有當數字是0的時候,數字才以0開頭,也就是說00和01這樣在前面補0是不允許的。
HEADER部分?
HEADER部分包括兩個字段,時間和主機名(或IP)。時間緊跟在PRI后面,中間沒有空格,格式必須是“Mmm dd hh:mm:ss”,不包括年份。“日”的數字如果是1~9,前面會補一個空格(也就是月份后面有兩個空格),而“小時”、“分”、“秒”則在前面補“0”。月份取值包括:
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
時間后邊跟一個空格,然后是主機名或者IP地址,主機名不得包括域名部分。
因為有些系統需要將日志長期歸檔,而時間字段又不包括年份,所以一些不標準的syslog格式中包含了年份,例如:
<165>Aug 24 05:34:00 CST 1987 mymachine myproc[10]: %% It's
time to make the do-nuts. %% Ingredients: Mix=OK, Jelly=OK #
Devices: Mixer=OK, Jelly_Injector=OK, Frier=OK # Transport:
Conveyer1=OK, Conveyer2=OK # %%
這樣會導致解析程序將“CST”當作主機名,而“1987”開始的部分作為MSG部分。解析程序面對這種問題,可能要做很多容錯處理,或者定制能解析多種syslog格式,而不僅僅是只能解析標準格式。
HEADER部分后面跟一個空格,然后是MSG部分。
有些syslog中沒有HEADER部分。這個時候MSG部分緊跟在PRI后面,中間沒有空格。
MSG部分?
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部分,這部分的內容是應用程序自定義的。
RFC3195?
BSD syslog協議使用UDP協議在網絡中傳遞,然而UDP是一個不可靠的協議,并且syslog也沒有要求接收方有所反饋。為了解決這個問題,RFC又定義了一個新的規范來可靠的傳遞syslog消息,它使用TCP協議:http://www.ietf.org/rfc/rfc3195.txt
不過大多數情況下,使用UDP發送不需要確認的syslog消息,已經能夠滿足要求了,并且這樣做非常簡單。因此到目前為止,RFC3195的應用還是很少見的。
幾種syslog的實現
由于syslog是一種RFC標準協議,所以其實現是平臺無關的,目前在各種Unix/Linux系統、網絡設備、終端設備中得到廣泛支持,當然最重要的還是用于類Unix系統中。syslogd
這是最傳統的syslog協議服務器端的實現,運行于大多數的Linux系統中。由于其安全性差、語法太自由而導致了很多的問題,目前有了一些替代品出現。rsyslogd
1. 后端存查日志支持的客戶端多。2. 在同一臺機器上支持多直rsyslogd進程,可以監聽在不同端口。
3. 直接兼容系統自帶的syslog.conf 配置文件。
4. 可將消息過濾后再次轉發。
5. 配置文件中可以寫簡單的邏輯判斷
6. 有現成的前端web展示程序
現在RHEL以及CentOS都已經把rsyslog作為默認的syslog安裝,不再使用syslogd了。
syslog-ng
也就是(next generation)下一代syslog,也是用來代替傳統syslogd的,只是這個玩意竟然不開放源代碼,所以也就不折騰這個了。kiwisyslog
Kiwi Syslog Server 是一個免費的Windows平臺上的syslog守護進程。它接收,記錄,顯示和轉發系統日志,如路由器,防火墻,交換機,Unix主機和其他功能的設備主機的syslog消息。有許多可供自定義的選項。其特點包括PIX防火墻日志記錄,Linksys的家庭防火墻日志,SNMP陷阱和TCP的支持,有能力進行篩選,分析和修改信息,并透過VBScript或JScript引擎執行動作。syslog配置文件與應用
syslog配置文件決定了處理日志信息的規則。主要依據就是前面協議部分提到的facility和Severity。下面按照實際的例子說明。[plain]?view plaincopy
基本語法格式
類型.級別 [;類型.級別] `TAB` 動作類型(Facility)
在配置文件中的名字如下:| facility參數 | syslog.conf中對應的facility取值 |
| LOG_KERN | kern |
| LOG_USER | user |
| LOG_MAIL | |
| LOG_DAEMON | daemon |
| LOG_AUTH | auth |
| LOG_SYSLOG | syslog |
| LOG_LPR | lpr |
| LOG_NEWS | news |
| LOG_UUCP | uucp |
| LOG_CRON | cron |
| LOG_AUTHPRIV | authpriv |
| LOG_FTP | ftp |
| LOG_LOCAL0~LOG_LOCAL7 | local0~local7 |
級別(Severity)
在配置文件中的名字如下:| priority參數 | syslog.conf中對應的level取值 |
| LOG_EMERG | emerg |
| LOG_ALERT | alert |
| LOG_CRIT | crit |
| LOG_ERR | err |
| LOG_WARNING | warning |
| LOG_NOTICE | notice |
| LOG_INFO | info |
| LOG_DEBUG | debug |
特殊*表示所有,none表示所有都不。
其中的=是特殊符號,如果存在說明只有本Severity的消息才進行處理,如果不存在則處理本Severity及其以下級別的消息。;用于“與”操作兩個選擇條件。!用于取反。
動作
動作”域指示信息發送的目的地。可以是:?
/filename???日志文件。由絕對路徑指出的文件名,此文件必須事先建立; 如果在文件名之前加上減號(-),則表示不將日志信息同步刷新到磁盤上(使用寫入緩存),這樣可以提高日志寫入性能,但是增加了系統崩潰后丟失日志的風險。 @host???????遠程主機; @符號后面可以是ip,也可以是域名,默認在/etc/hosts文件下loghost這個別名已經指定給了本機。????user1,user2 指定用戶。如果指定用戶已登錄,那么他們將收到信息;?
????*???????????所有用戶。所有已登錄的用戶都將收到信息。
syslog客戶端編程
既然syslog是一個標準的協議,所以客戶端和服務器端可以獨立開發。對于應用程序員來說,重新開發一個syslog服務器的可能性不大,但是在程序中使用syslog的日志功能非常常見,也就是客戶端開發。客戶端有兩種方式開發,一是完全基于協議從底層開發,也就是直接寫unix域套接字、向UDP514發送定制消息。這樣做往往比較麻煩,所以大多數語言都提供了庫函數供上層應用使用,C、PHP、Java等都有相應的庫函數。
大多數的開源套件如apache,mysql,sendmail,postfix等都在內部使用了syslog來進行日志處理。接下來我們以C語言為例,開發一個簡單的利用syslog進行日志管理的程序。
以C為例說明:
[cpp]?view plaincopy
按照打開日志、寫入日志、關閉日志的方式進行操作。其實理解了syslog協議,編程就很簡單了,關鍵點還是在syslog()函數中指定日志的類別(Facility)和級別(Severity)。上面例子中,日志的類別是LOG_USER,對應的配置文件名就是user,進行了兩個級別日志的寫入,一個是LOG_INFO,對應于配置文件的info,另一個是LOG_DEBUG對應于配置文件的debug。 由于對應的系統的syslog.conf文件中有如下一行:
*.info;mail.none;authpriv.none;cron.none ? ? ? ? ? ? ? ?/var/log/messages
所以,我們會在/var/log/messages這個文件中找到在程序中產生的日志信息,如下:
May 13 14:52:29 localhost log_test[13900]: PID information, pid=13900
因為DEBUG級別低于INFO,所以不會被存入文件。
更多的關于各個庫函數的詳細用法,請參考API文檔。
日志文件的分析
syslog記錄的日志內容并沒有什么固定的格式,可以說相當的隨意。所以,自動分析工作有一定的難度,需要處理好包容問題。慶幸的是,所有的日志內容都是人類可讀的ASCII文本,所以對于管理員比較友好。可以根據不同的系統,定制一些自動化分析腳本來輔助工作。日志文件的輪替logrotate
日志文件會隨著日志的增加而不斷增大,從而帶來效率問題和空間使用問題。在常年運行的服務器上面,通常會有logrotate程序定期進行日志文件的輪替和刪除工作。關于logrotate的配置與設置,這里不進行詳述。轉載于:https://www.cnblogs.com/leeeee/p/7276387.html
總結
- 上一篇: 两情相悦,劲舞团。是什么意思?
- 下一篇: DEV柱状图----傻瓜版