Linux日志管理高級進(jìn)階:實(shí)例詳解syslog
原創(chuàng)【51CTO獨(dú)家特稿】 syslog已被許多日志函數(shù)采納,它用在許多保護(hù)措施中,任何程序都可以通過syslog記錄事件。syslog可以記錄系統(tǒng)事件,可以寫到一個(gè)文件或設(shè)備中,或給用戶發(fā)送一個(gè)信息。它能記錄本地事件或通過網(wǎng)絡(luò)記錄另一個(gè)主機(jī)上的事件。
1、syslog簡介
syslog是一種工業(yè)標(biāo)準(zhǔn)的協(xié)議,可用來記錄設(shè)備的日志。在UNIX系統(tǒng),路由器、交換機(jī)等網(wǎng)絡(luò)設(shè)備中,系統(tǒng)日志(System Log)記錄系統(tǒng)中任何時(shí)間發(fā)生的大小事件。管理者可以通過查看系統(tǒng)記錄,隨時(shí)掌握系統(tǒng)狀況。UNIX的系統(tǒng)日志是通過syslogd這個(gè)進(jìn)程記錄系統(tǒng)有關(guān)事件記錄,也可以記錄應(yīng)用程序運(yùn)作事件。通過適當(dāng)?shù)呐渲?,我們還可以實(shí)現(xiàn)運(yùn)行syslog協(xié)議的機(jī)器間通信,通過分析這些網(wǎng)絡(luò)行為日志,藉以追蹤掌握與設(shè)備和網(wǎng)絡(luò)有關(guān)的狀況。
2、syslog配置文件
syslog設(shè)備依據(jù)兩個(gè)重要的文件:/etc/syslogd守護(hù)進(jìn)程和/etc/syslog.conf配置文件。通常情況下,多數(shù)syslog信息被寫到/var/adm或/var/log目錄下的信息文件中(messages.*)。一個(gè)典型的syslog記錄包括生成程序的名字和一個(gè)文本信息。它還包括一個(gè)設(shè)備和一個(gè)優(yōu)先級范圍。
通過使用syslog.conf文件,可以對生成的日志的位置及其相關(guān)信息進(jìn)行靈活的配置。該配置文件指明了syslogd守護(hù)程序記錄日志的行為,該程序在啟動(dòng)時(shí)查詢配置文件。該文件由不同程序或消息分類的單個(gè)條目組成,每個(gè)占一行。對每類消息提供一個(gè)選擇域和一個(gè)動(dòng)作域。這些域由tab隔開:
- 選擇域指明消息的類型和優(yōu)先級;
- 動(dòng)作域指明syslogd接收到一個(gè)與選擇標(biāo)準(zhǔn)相匹配的消息時(shí)所執(zhí)行的動(dòng)作。
syslog.conf行的基本語法是:
消息類型.優(yōu)先級 動(dòng)作域
其中,每個(gè)選擇域是由消息類型和優(yōu)先級組成。當(dāng)指明一個(gè)優(yōu)先級時(shí),syslogd將記錄一個(gè)擁有相同或更高優(yōu)先級的消息。Linux中一些主要的消息類型如表2所示,表3列出了一些優(yōu)先級信息:
表2 syslog消息類型
消息類型 | 消息來源 |
kern | 內(nèi)核 |
User | 用戶程序 |
Damon | 系統(tǒng)守護(hù)進(jìn)程 |
電子郵件系統(tǒng) | |
Auth | 與安全權(quán)限相關(guān)的命令 |
Lpr | 打印機(jī) |
News | 新聞組信息 |
Uucp | Uucp程序 |
Cron | 記錄當(dāng)前登錄的每個(gè)用戶信息 |
wtmp | 一個(gè)用戶每次登錄進(jìn)入和退出時(shí)間的***記錄 |
Authpriv | 授權(quán)信息 |
表3 syslog常用優(yōu)先級
優(yōu)先級 | 描述 |
emerg | ***的緊急程度狀態(tài) |
alert | 緊急狀態(tài) |
Cirt | 重要信息 |
warning | 警告 |
err | 臨界狀態(tài) |
notice | 出現(xiàn)不尋常的事情 |
info | 一般性消息 |
Debug | 調(diào)試級信息 |
None | 不記錄任何日志信息 |
不同的服務(wù)類型有不同的優(yōu)先級,數(shù)值較大的優(yōu)先級涵蓋數(shù)值較小的優(yōu)先級。如果某個(gè)選擇條件只給出了一個(gè)優(yōu)先級而沒有使用任何優(yōu)先級限定符,對應(yīng)于這個(gè)優(yōu)先級的消息以及所有更緊急的消息類型都將包括在內(nèi)。比如說,如果某個(gè)選擇條件里的優(yōu)先級是“warning”,它實(shí)際上將把“warning”、“err”、“crit”、“alert“和“emerg”都包括在內(nèi)。
syslog允許人們使用三種限定符對優(yōu)先級進(jìn)行修飾:星號(*)、等號(=)和嘆號(!):
- 星號(*)的含義是把本項(xiàng)服務(wù)生成的所有日志消息都發(fā)送到操作動(dòng)作指定的地點(diǎn)。就像它在規(guī)則表達(dá)式里的作用一樣,星號代表“任何東西”。在前面給出的例子里,“mail.*”將把所有優(yōu)先級的消息都發(fā)送到操作動(dòng)作指定的/var/log/mail文件里。使用“*”限定符與使用“debug”優(yōu)先級的效果完全一樣,后者也將把所有類型的消息發(fā)送到指定地點(diǎn)。
- 等號(=)的含義是只把本項(xiàng)服務(wù)生成的本優(yōu)先級的日志消息都發(fā)送到操作動(dòng)作指定的地點(diǎn)。比如說,可以用“=”限定符只發(fā)送調(diào)試消息而不發(fā)送其他更緊急的消息(這將為應(yīng)用程序減輕很多負(fù)擔(dān))。當(dāng)你只需要發(fā)送特定優(yōu)先級別的消息時(shí),就要使用等號限定符。
- 嘆號(!)的含義是把本項(xiàng)服務(wù)生成的所有日志消息都發(fā)送到操作動(dòng)作指定的地點(diǎn),但本優(yōu)先級的消息不包括在內(nèi)。
所以,根據(jù)上面介紹的相關(guān)知識,我們給出如下例子作為示范:
(1)如果指明\"crit\",那所有標(biāo)為crit、alert和emerg的消息將被記錄。每行的行動(dòng)域指明當(dāng)選擇域選擇了一個(gè)給定消息后應(yīng)該把他發(fā)送到哪兒。例如,如果想把所有郵件消息記錄到一個(gè)文件中,如下所示:
#Log all the mail messages in one place mail.* /var/log/maillog
(2)其他設(shè)備也有自己的日志。UUCP和news設(shè)備能產(chǎn)生許多外部消息。它把這些消息存到自己的日志(/var/log/spooler)中并把級別限為\"err\"或更高。例如:
# Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler
(3)當(dāng)一個(gè)緊急消息到來時(shí),可能想讓所有的用戶都得到。也可能想讓自己的日志接收并保存。
#Everybody gets emergency messages, plus log them on anther machine *.emerg * *.emerg @linuxaid.com.cn
(4)有時(shí)syslogd將產(chǎn)生大量的消息。例如內(nèi)核(\"kern\"設(shè)備)可能很冗長,用戶很難看得清楚明了,那么用戶可能想把內(nèi)核消息記錄到/dev/console中。下面的例子表明內(nèi)核日志記錄被注釋掉了:
#Log all kernel messages to the console #Logging much else clutters up the screen #kern.* /dev/console
(5)用戶可以在一行中指明所有的設(shè)備。下面的例子把info或更高級別的消息送到/var/log/messages,除了mail以外。級別\"none\"禁止一個(gè)設(shè)備:
#Log anything(except mail)of level info or higher #Don\'t log private authentication messages! *.info:mail.none;autHPriv.none /var/log/messages
#p#
3、syslog進(jìn)程
syslogd守護(hù)程序是由/etc/rc.d/init.d/syslog腳本在運(yùn)行級2下被調(diào)用的,缺省不使用選項(xiàng)。但有兩個(gè)選項(xiàng)-r和-h很有用:
- 如果將要使用一個(gè)日志服務(wù)器,必須調(diào)用syslogd -r。缺省情況下syslogd不接受來自遠(yuǎn)程系統(tǒng)的信息。當(dāng)指定-r選項(xiàng),syslogd將會(huì)監(jiān)聽從514端口上進(jìn)來的UDP包。
- 如果還希望日志服務(wù)器能傳送日志信息,可以使用-h標(biāo)志。缺省時(shí),syslogd將忽略使其從一個(gè)遠(yuǎn)程系統(tǒng)傳送日志信息到另一個(gè)系統(tǒng)的syslogd。
另外,如果需要重新啟動(dòng)syslog守護(hù)進(jìn)程(/etc/syslog.conf的修改只有在syslog守護(hù)進(jìn)程重新啟動(dòng)后才會(huì)生效),并且只想重新啟動(dòng)syslog守護(hù)進(jìn)程而不是整個(gè)系統(tǒng),在Red Hat Linux機(jī)器上,執(zhí)行以下兩條命令之一即可:
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart /etc/rc.d/init.d/syslogrestart
4、靈活運(yùn)用syslog調(diào)用接口
在實(shí)際的使用過程中,我們可以通過配置文件和查看相應(yīng)的日志文件來使用syslog。然而,在許多應(yīng)用場景下,我們往往需要通過程序產(chǎn)生輸出信息并進(jìn)行記錄,也就是說要把一些信息寫成日志文件,正常情況下運(yùn)行程序的人不用關(guān)心日志里的內(nèi)容,只有在出現(xiàn)問題的時(shí)候才會(huì)查看日志文件里的內(nèi)容以確定問題所在。因此,下面將詳細(xì)介紹如何通過syslog日志系統(tǒng)提供的API調(diào)用接口,來使用程序?qū)崿F(xiàn)對syslog的使用。
1.主要的函數(shù)
在Linux中,提供了四個(gè)有關(guān)syslog日志系統(tǒng)的系統(tǒng)調(diào)用,供用戶使用:
- openlog:打開日志設(shè)備,以供讀取和寫入,與文件系統(tǒng)調(diào)用的open類似;
- syslog:寫入日志,與文件系統(tǒng)調(diào)用的write類似;
- closelog:關(guān)閉日志設(shè)備,與文件系統(tǒng)調(diào)用的close類似;
- vsyslog:它和syslog功能一樣,負(fù)責(zé)寫入日志,只是參數(shù)格式不同。
(1)openlog函數(shù)
該函數(shù)的聲明如下:
void openlog(const char *ident, int option, int facility);
此函數(shù)用來打開一個(gè)到系統(tǒng)日志記錄程序的連接,打開之后就可以用syslog或vsyslog函數(shù)向系統(tǒng)日志里添加信息了。而closelog函數(shù)就是用來關(guān)閉此連接的。
openlog的***個(gè)參數(shù)ident是一個(gè)標(biāo)記,ident所表示的字符串將固定地加在每行日志的前面以標(biāo)識這個(gè)日志,通常就寫成當(dāng)前程序的名稱以作標(biāo)記。第二個(gè)參數(shù)option一般是下列選項(xiàng)值取“與”運(yùn)算(使用“|”表示,如“LOG_CONS | LOG_PID”)的結(jié)果:
- LOG_CONS:如果送到system logger時(shí)發(fā)生問題,直接寫入系統(tǒng)終端;
- LOG_NDELAY:立即開啟連接,通常連接是在***次寫入消息時(shí)才打開的;
- LOG_PERROR:將消息也同時(shí)送到stderr設(shè)備;
- LOG_PID:將進(jìn)程PID含入所有消息中。
第三個(gè)參數(shù)facility指明記錄日志的程序的類型,它主要具有如下幾類日志類型:
- LOG_AUTH :安全/授權(quán)消息
- LOG_AUTHPRIV:安全/授權(quán)消息
- LOG_CRON:時(shí)間守護(hù)進(jìn)程(cron和at)專用
- LOG_DAEMON:其它系統(tǒng)守護(hù)進(jìn)程
- LOG_KERN:核心消息
- LOG_LOCAL0到LOG_LOCAL7:系統(tǒng)保留
- LOG_LPR:printer子系統(tǒng)
- LOG_MAIL:mail子系統(tǒng)
- LOG_NEWS:USENET新聞子系統(tǒng)
- LOG_SYSLOG:syslogd進(jìn)程內(nèi)部所產(chǎn)生的消息
- LOG_USER(缺省):一般使用者缺省使用消息
- LOG_UUCP:UUCP子系統(tǒng)
- LOG_FTP:FTP子系統(tǒng)使用
(2)syslog函數(shù)
syslog函數(shù)的聲明如下:
void syslog(int priority, const char * message, ...);
***個(gè)參數(shù)是消息的緊急級別priority,第二個(gè)參數(shù)是消息及其格式,之后是格式對應(yīng)的參數(shù),如同C語言里面printf輸出函數(shù)一樣使用,具體的格式這里就不再詳述,它不是本書介紹的重點(diǎn)。
這里還需要詳細(xì)介紹一下***個(gè)參數(shù)priority,它是由severity level和facility組成的。Facility已經(jīng)在上面介紹了,下面介紹一下severity level,也就是消息的重要級別,它主要包括:
- LOG_EMERG:緊急狀況
- LOG_ALERT:高優(yōu)先級問題,比如說數(shù)據(jù)庫崩潰等,必須要立即采取反應(yīng)行動(dòng)
- LOG_CRIT:重要狀況發(fā)生,比如硬件故障
- LOG_ERR:錯(cuò)誤發(fā)生
- LOG_WARNING:警告發(fā)生
- LOG_NOTICE:一般狀況,需要引起注意
- LOG_INFO:信息狀況
- LOG_DEBUG:調(diào)試消息
在實(shí)際使用中,如果我們的程序要使用系統(tǒng)日志功能,只需要在程序啟動(dòng)時(shí)使用openlog函數(shù)來連接syslogd程序,后面隨時(shí)用syslog函數(shù)寫日志就行了。
(3)closelog函數(shù)
相對上述2個(gè)函數(shù)來說,該函數(shù)非常簡單,其聲明如下:
void closelog( void );
值得注意的是,雖然該函數(shù)的使用和調(diào)用情況非常簡單,但是是必不可少的,因?yàn)樵贚inux系統(tǒng)中,打開的日志也是資源,如果只使用openlog函數(shù)打開日志,而忘記使用closelog關(guān)閉日志的話,當(dāng)打開的日志數(shù)量累積到一定程度,便會(huì)造成內(nèi)存不足,從而引起系統(tǒng)問題。所以,提醒用戶在使用中特別注意。
2.一個(gè)實(shí)際的程序調(diào)用例子
下面給出一個(gè)使用上述幾個(gè)函數(shù)寫日志的例子,以供大家參考:
#include #include #include int main(void) { int log_test; /*打開日志*/ openlog("log_test ", LOG_PID|LOG_CONS, LOG_USER); /*寫日志*/ syslog(LOG_INFO, "PID information, pid=%d", getpid()); syslog(LOG_DEBUG,"debug message "); /*關(guān)閉日志*/ closelog(); }
【編輯推薦】
- CairoPlot讓Linux服務(wù)器的日志文件更直觀
- 日志系統(tǒng) 使Linux管理更輕松
- 在Linux系統(tǒng)中安裝系統(tǒng)日志服務(wù)器
- 明明白白你的Linux服務(wù)器——日志篇
- Linux日志管理五大命令詳解