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