日志模塊進(jìn)化史
ver1 CEidt重載<<
ver2 多標(biāo)簽 Richedit CLogFile <<
ver3 多標(biāo)簽 ListCtrl PrintLog(...)
ver4
開(kāi)始想到kiwi syslog, 測(cè)試了一下 fwrite 和 sendto 的速度,放棄
這個(gè)方法更好,fwrite + 文件監(jiān)視
http://blog.csdn.net/xcj0535/archive/2009/05/07/4158624.aspx
在網(wǎng)上搜的文章,寫(xiě)的很全乎。摘抄如下,供大家參考學(xué)習(xí)
1、介紹
在Unix類操作系統(tǒng)上,syslog廣泛應(yīng)用于系統(tǒng)日志。syslog日志消息既可以記錄在本地文件中,也可以通過(guò)網(wǎng)絡(luò)發(fā)送到接收syslog的服務(wù)器。接收syslog的服務(wù)器可以對(duì)多個(gè)設(shè)備的syslog消息進(jìn)行統(tǒng)一的存儲(chǔ),或者解析其中的內(nèi)容做相應(yīng)的處理。常見(jiàn)的應(yīng)用場(chǎng)景是網(wǎng)絡(luò)管理工具、安全管理系統(tǒng)、日志審計(jì)系統(tǒng)。
完整的syslog日志中包含產(chǎn)生日志的程序模塊(Facility)、嚴(yán)重性(Severity或 Level)、時(shí)間、主機(jī)名或IP、進(jìn)程名、進(jìn)程ID和正文。在Unix類操作系統(tǒng)上,能夠按Facility和Severity的組合來(lái)決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發(fā)送到一個(gè)接收syslog的服務(wù)器等。由于syslog簡(jiǎn)單而靈活的特性,syslog不再僅限于 Unix類主機(jī)的日志記錄,任何需要記錄和發(fā)送日志的場(chǎng)景,都可能會(huì)使用syslog。
長(zhǎng)期以來(lái),沒(méi)有一個(gè)標(biāo)準(zhǔn)來(lái)規(guī)范syslog的格式,導(dǎo)致syslog的格式是非常隨意的。最壞的情況下,根本就沒(méi)有任何格式,導(dǎo)致程序不能對(duì)syslog 消息進(jìn)行解析,只能將它看作是一個(gè)字符串。
在2001年定義的RFC3164中,描述了BSD syslog協(xié)議:
http://www.ietf.org/rfc/rfc3164.txt
不過(guò)這個(gè)規(guī)范的很多內(nèi)容都不是強(qiáng)制性的,常常是“建議”或者“約定”,也由于這個(gè)規(guī)范出的比較晚,很多設(shè)備并不遵守或不完全遵守這個(gè)規(guī)范。接下來(lái)就介紹一 下這個(gè)規(guī)范。
約定發(fā)送syslog的設(shè)備為Device,轉(zhuǎn)發(fā)syslog的設(shè)備為Relay,接收syslog的設(shè)備為Collector。Relay本身也可以發(fā)送自身的syslog給Collector,這個(gè)時(shí)候它表現(xiàn)為一個(gè)Device。Relay也可以只轉(zhuǎn)發(fā)部分接收到的syslog消息,這個(gè)時(shí)候它同時(shí)表現(xiàn)為Relay和Collector。
syslog消息發(fā)送到Collector的UDP 514端口,不需要接收方應(yīng)答,RFC3164建議 Device 也使用514作為源端口。規(guī)定syslog消息的UDP報(bào)文不能超過(guò)1024字節(jié),并且全部由可打印的字符組成。完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒(méi)有。
2、syslog的格式
下面是一個(gè)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部分。
2.1、PRI部分
PRI部分由尖括號(hào)包含的一個(gè)數(shù)字構(gòu)成,這個(gè)數(shù)字包含了程序模塊(Facility)、嚴(yán)重性(Severity),這個(gè)數(shù)字是由Facility乘以 8,然后加上Severity得來(lái)。不知道他們?yōu)槭裁窗l(fā)明了這么一種不直觀的表示方式。
也就是說(shuō)這個(gè)數(shù)字如果換成2進(jìn)制的話,低位的3個(gè)bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。
十進(jìn)制30 = 二進(jìn)制0001 1110
0001 1... = Facility: DAEMON - system daemons (3)
.... .110 = Severity: INFO - informational (6)
Facility的定義如下,可以看出來(lái)syslog的Facility是早期為Unix操作系統(tǒng)定義的,不過(guò)它預(yù)留了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
也就是說(shuō),尖括號(hào)中有1~3個(gè)數(shù)字字符,只有當(dāng)數(shù)字是0的時(shí)候,數(shù)字才以0開(kāi)頭,也就是說(shuō)00和01這樣在前面補(bǔ)0是不允許的。
2.2、HEADER部分
HEADER部分包括兩個(gè)字段,時(shí)間和主機(jī)名(或IP)。
時(shí)間緊跟在PRI后面,中間沒(méi)有空格,格式必須是“Mmm dd hh:mm:ss”,不包括年份。“日”的數(shù)字如果是1~9,前面會(huì)補(bǔ)一個(gè)空格(也就是月份后面有兩個(gè)空格),而“小時(shí)”、“分”、“秒”則在前面補(bǔ)“0”。月份取值包括:
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
時(shí)間后邊跟一個(gè)空格,然后是主機(jī)名或者IP地址,主機(jī)名不得包括域名部分。
因?yàn)橛行┫到y(tǒng)需要將日志長(zhǎng)期歸檔,而時(shí)間字段又不包括年份,所以一些不標(biāo)準(zhǔn)的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 # %%
這樣會(huì)導(dǎo)致解析程序?qū)?#8220;CST”當(dāng)作主機(jī)名,而“1987”開(kāi)始的部分作為MSG部分。解析程序面對(duì)這種問(wèn)題,可能要做很多容錯(cuò)處理,或者定制能解析多種syslog格式,而不僅僅是只能解析標(biāo)準(zhǔn)格式。
HEADER部分后面跟一個(gè)空格,然后是MSG部分。
有些syslog中沒(méi)有HEADER部分。這個(gè)時(shí)候MSG部分緊跟在PRI后面,中間沒(méi)有空格。
2.3、MSG部分
MSG部分又分為兩個(gè)部分,TAG和Content。其中TAG部分是可選的。
在前面的例子中(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.”),“auditd[1787]”是TAG部分,包含了進(jìn)程名稱和進(jìn)程PID。PID可以沒(méi)有,這個(gè)時(shí)候中括號(hào)也是沒(méi)有的。
進(jìn)程PID有時(shí)甚至不是一個(gè)數(shù)字,例如“root-1787”,解析程序要做好容錯(cuò)準(zhǔn)備。
TAG后面用一個(gè)冒號(hào)隔開(kāi)Content部分,這部分的內(nèi)容是應(yīng)用程序自定義的。
3、RFC3195
BSD syslog協(xié)議使用UDP協(xié)議在網(wǎng)絡(luò)中傳遞,然而UDP是一個(gè)不可靠的協(xié)議,并且syslog也沒(méi)有要求接收方有所反饋。為了解決這個(gè)問(wèn)題,RFC又定義了一個(gè)新的規(guī)范來(lái)可靠的傳遞syslog消息,它使用TCP協(xié)議:
http://www.ietf.org/rfc/rfc3195.txt
不過(guò)大多數(shù)情況下,使用UDP發(fā)送不需要確認(rèn)的syslog消息,已經(jīng)能夠滿足要求了,并且這樣做非常簡(jiǎn)單。因此到目前為止,RFC3195的應(yīng)用還是很少見(jiàn)的