关于syslog
syslog架構(gòu)
Unix/Linux系統(tǒng)中的大部分日志都是通過一種叫做syslog的機(jī)制產(chǎn)生和維護(hù)的。syslog是一種標(biāo)準(zhǔn)的協(xié)議,分為客戶端和服務(wù)器端,客戶端是產(chǎn)生日志消息的一方,而服務(wù)器端負(fù)責(zé)接收客戶端發(fā)送來的日志消息,并做出保存到特定的日志文件中或者其他方式的處理。在Linux中,常見的syslog服務(wù)器端程序是syslogd守護(hù)程序。這個(gè)程序可以從三個(gè)地方接收日志消息:(1)Unix域套接字 /dev/log;(2)UDP端口514;(3)特殊的設(shè)備/dev/klog(讀取內(nèi)核發(fā)出的消息)。相應(yīng)地,產(chǎn)生日志消息的程序就需要通過上述三種方式寫入消息,對(duì)于大多數(shù)程序而言就是向/dev/log這個(gè)套接字發(fā)送日志消息。
關(guān)于syslog的協(xié)議
介紹?
在Unix類操作系統(tǒng)上,syslog廣泛應(yīng)用于系統(tǒng)日志。syslog日志消息既可以記錄在本地文件中,也可以通過網(wǎng)絡(luò)發(fā)送到接收syslog的服務(wù)器。接收syslog的服務(wù)器可以對(duì)多個(gè)設(shè)備的syslog消息進(jìn)行統(tǒng)一的存儲(chǔ),或者解析其中的內(nèi)容做相應(yīng)的處理。常見的應(yī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的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發(fā)送到一個(gè)接收syslog的服務(wù)器等。由于syslog簡單而靈活的特性,syslog不再僅限于 Unix類主機(jī)的日志記錄,任何需要記錄和發(fā)送日志的場景,都可能會(huì)使用syslog。
長期以來,沒有一個(gè)標(biāo)準(zhǔn)來規(guī)范syslog的格式,導(dǎo)致syslog的格式是非常隨意的。最壞的情況下,根本就沒有任何格式,導(dǎo)致程序不能對(duì)syslog 消息進(jìn)行解析,只能將它看作是一個(gè)字符串。
在2001年定義的RFC3164中,描述了BSD syslog協(xié)議:
http://www.ietf.org/rfc/rfc3164.txt
不過這個(gè)規(guī)范的很多內(nèi)容都不是強(qiáng)制性的,常常是“建議”或者“約定”,也由于這個(gè)規(guī)范出的比較晚,很多設(shè)備并不遵守或不完全遵守這個(gè)規(guī)范。接下來就介紹一 下這個(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)文不能超過1024字節(jié),并且全部由可打印的字符組成。完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒有。
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部分。
PRI部分?
PRI部分由尖括號(hào)包含的一個(gè)數(shù)字構(gòu)成,這個(gè)數(shù)字包含了程序模塊(Facility)、嚴(yán)重性(Severity),這個(gè)數(shù)字是由Facility乘以 8,然后加上Severity得來。不知道他們?yōu)槭裁窗l(fā)明了這么一種不直觀的表示方式。也就是說這個(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的定義如下,可以看出來syslog的Facility是早期為Unix操作系統(tǒng)定義的,不過它預(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
也就是說,尖括號(hào)中有1~3個(gè)數(shù)字字符,只有當(dāng)數(shù)字是0的時(shí)候,數(shù)字才以0開頭,也就是說00和01這樣在前面補(bǔ)0是不允許的。
HEADER部分?
HEADER部分包括兩個(gè)字段,時(shí)間和主機(jī)名(或IP)。時(shí)間緊跟在PRI后面,中間沒有空格,格式必須是“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)需要將日志長期歸檔,而時(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ū)ⅰ癈ST”當(dāng)作主機(jī)名,而“1987”開始的部分作為MSG部分。解析程序面對(duì)這種問題,可能要做很多容錯(cuò)處理,或者定制能解析多種syslog格式,而不僅僅是只能解析標(biāo)準(zhǔn)格式。
HEADER部分后面跟一個(gè)空格,然后是MSG部分。
有些syslog中沒有HEADER部分。這個(gè)時(shí)候MSG部分緊跟在PRI后面,中間沒有空格。
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可以沒有,這個(gè)時(shí)候中括號(hào)也是沒有的。
進(jìn)程PID有時(shí)甚至不是一個(gè)數(shù)字,例如“root-1787”,解析程序要做好容錯(cuò)準(zhǔn)備。
TAG后面用一個(gè)冒號(hào)隔開Content部分,這部分的內(nèi)容是應(yīng)用程序自定義的。
RFC3195?
BSD syslog協(xié)議使用UDP協(xié)議在網(wǎng)絡(luò)中傳遞,然而UDP是一個(gè)不可靠的協(xié)議,并且syslog也沒有要求接收方有所反饋。為了解決這個(gè)問題,RFC又定義了一個(gè)新的規(guī)范來可靠的傳遞syslog消息,它使用TCP協(xié)議:http://www.ietf.org/rfc/rfc3195.txt
不過大多數(shù)情況下,使用UDP發(fā)送不需要確認(rèn)的syslog消息,已經(jīng)能夠滿足要求了,并且這樣做非常簡單。因此到目前為止,RFC3195的應(yīng)用還是很少見的。
幾種syslog的實(shí)現(xiàn)
由于syslog是一種RFC標(biāo)準(zhǔn)協(xié)議,所以其實(shí)現(xiàn)是平臺(tái)無關(guān)的,目前在各種Unix/Linux系統(tǒng)、網(wǎng)絡(luò)設(shè)備、終端設(shè)備中得到廣泛支持,當(dāng)然最重要的還是用于類Unix系統(tǒng)中。syslogd
這是最傳統(tǒng)的syslog協(xié)議服務(wù)器端的實(shí)現(xiàn),運(yùn)行于大多數(shù)的Linux系統(tǒng)中。由于其安全性差、語法太自由而導(dǎo)致了很多的問題,目前有了一些替代品出現(xiàn)。rsyslogd
1. 后端存查日志支持的客戶端多。2. 在同一臺(tái)機(jī)器上支持多直rsyslogd進(jìn)程,可以監(jiān)聽在不同端口。
3. 直接兼容系統(tǒng)自帶的syslog.conf 配置文件。
4. 可將消息過濾后再次轉(zhuǎn)發(fā)。
5. 配置文件中可以寫簡單的邏輯判斷
6. 有現(xiàn)成的前端web展示程序
現(xiàn)在RHEL以及CentOS都已經(jīng)把rsyslog作為默認(rèn)的syslog安裝,不再使用syslogd了。
syslog-ng
也就是(next generation)下一代syslog,也是用來代替?zhèn)鹘y(tǒng)syslogd的,只是這個(gè)玩意竟然不開放源代碼,所以也就不折騰這個(gè)了。kiwisyslog
Kiwi Syslog Server 是一個(gè)免費(fèi)的Windows平臺(tái)上的syslog守護(hù)進(jìn)程。它接收,記錄,顯示和轉(zhuǎn)發(fā)系統(tǒng)日志,如路由器,防火墻,交換機(jī),Unix主機(jī)和其他功能的設(shè)備主機(jī)的syslog消息。有許多可供自定義的選項(xiàng)。其特點(diǎn)包括PIX防火墻日志記錄,Linksys的家庭防火墻日志,SNMP陷阱和TCP的支持,有能力進(jìn)行篩選,分析和修改信息,并透過VBScript或JScript引擎執(zhí)行動(dòng)作。syslog配置文件與應(yīng)用
syslog配置文件決定了處理日志信息的規(guī)則。主要依據(jù)就是前面協(xié)議部分提到的facility和Severity。下面按照實(shí)際的例子說明。[plain]?view plaincopy
基本語法格式
類型.級(jí)別 [;類型.級(jí)別] `TAB` 動(dòng)作類型(Facility)
在配置文件中的名字如下:| facility參數(shù) | syslog.conf中對(duì)應(yīng)的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 |
級(jí)別(Severity)
在配置文件中的名字如下:| priority參數(shù) | syslog.conf中對(duì)應(yīng)的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表示所有都不。
其中的=是特殊符號(hào),如果存在說明只有本Severity的消息才進(jìn)行處理,如果不存在則處理本Severity及其以下級(jí)別的消息。;用于“與”操作兩個(gè)選擇條件。!用于取反。
動(dòng)作
動(dòng)作”域指示信息發(fā)送的目的地。可以是:?
/filename???日志文件。由絕對(duì)路徑指出的文件名,此文件必須事先建立; 如果在文件名之前加上減號(hào)(-),則表示不將日志信息同步刷新到磁盤上(使用寫入緩存),這樣可以提高日志寫入性能,但是增加了系統(tǒng)崩潰后丟失日志的風(fēng)險(xiǎn)。 @host???????遠(yuǎn)程主機(jī); @符號(hào)后面可以是ip,也可以是域名,默認(rèn)在/etc/hosts文件下loghost這個(gè)別名已經(jīng)指定給了本機(jī)。????user1,user2 指定用戶。如果指定用戶已登錄,那么他們將收到信息;?
????*???????????所有用戶。所有已登錄的用戶都將收到信息。
syslog客戶端編程
既然syslog是一個(gè)標(biāo)準(zhǔn)的協(xié)議,所以客戶端和服務(wù)器端可以獨(dú)立開發(fā)。對(duì)于應(yīng)用程序員來說,重新開發(fā)一個(gè)syslog服務(wù)器的可能性不大,但是在程序中使用syslog的日志功能非常常見,也就是客戶端開發(fā)。客戶端有兩種方式開發(fā),一是完全基于協(xié)議從底層開發(fā),也就是直接寫unix域套接字、向UDP514發(fā)送定制消息。這樣做往往比較麻煩,所以大多數(shù)語言都提供了庫函數(shù)供上層應(yīng)用使用,C、PHP、Java等都有相應(yīng)的庫函數(shù)。
大多數(shù)的開源套件如apache,mysql,sendmail,postfix等都在內(nèi)部使用了syslog來進(jìn)行日志處理。接下來我們以C語言為例,開發(fā)一個(gè)簡單的利用syslog進(jìn)行日志管理的程序。
以C為例說明:
[cpp]?view plaincopy
按照打開日志、寫入日志、關(guān)閉日志的方式進(jìn)行操作。其實(shí)理解了syslog協(xié)議,編程就很簡單了,關(guān)鍵點(diǎn)還是在syslog()函數(shù)中指定日志的類別(Facility)和級(jí)別(Severity)。上面例子中,日志的類別是LOG_USER,對(duì)應(yīng)的配置文件名就是user,進(jìn)行了兩個(gè)級(jí)別日志的寫入,一個(gè)是LOG_INFO,對(duì)應(yīng)于配置文件的info,另一個(gè)是LOG_DEBUG對(duì)應(yīng)于配置文件的debug。 由于對(duì)應(yīng)的系統(tǒng)的syslog.conf文件中有如下一行:
*.info;mail.none;authpriv.none;cron.none ? ? ? ? ? ? ? ?/var/log/messages
所以,我們會(huì)在/var/log/messages這個(gè)文件中找到在程序中產(chǎn)生的日志信息,如下:
May 13 14:52:29 localhost log_test[13900]: PID information, pid=13900
因?yàn)镈EBUG級(jí)別低于INFO,所以不會(huì)被存入文件。
更多的關(guān)于各個(gè)庫函數(shù)的詳細(xì)用法,請(qǐng)參考API文檔。
日志文件的分析
syslog記錄的日志內(nèi)容并沒有什么固定的格式,可以說相當(dāng)?shù)碾S意。所以,自動(dòng)分析工作有一定的難度,需要處理好包容問題。慶幸的是,所有的日志內(nèi)容都是人類可讀的ASCII文本,所以對(duì)于管理員比較友好。可以根據(jù)不同的系統(tǒng),定制一些自動(dòng)化分析腳本來輔助工作。日志文件的輪替logrotate
日志文件會(huì)隨著日志的增加而不斷增大,從而帶來效率問題和空間使用問題。在常年運(yùn)行的服務(wù)器上面,通常會(huì)有l(wèi)ogrotate程序定期進(jìn)行日志文件的輪替和刪除工作。關(guān)于logrotate的配置與設(shè)置,這里不進(jìn)行詳述。轉(zhuǎn)載于:https://www.cnblogs.com/leeeee/p/7276387.html
總結(jié)
- 上一篇: 两情相悦,劲舞团。是什么意思?
- 下一篇: DEV柱状图----傻瓜版