1、syslog簡介
syslog 是一種工業標准的協議,可用來記錄設備的日志。在UNIX系統,路由器、交換機等網絡設備中,系統日志(System Log)記錄系統中任何時間發生的大小事件。管理者可以通過查看系統記錄,隨時掌握系統狀況。UNIX的系統日志是通過syslogd這個進程記錄系統有關事件記錄,也可以記錄應用程序運作事件。通過適當的配置,我們還可以實現運行syslog協議的機器間通信,通過分析這些網絡行為日志,藉以追蹤掌握與設備和網絡有關的狀況。
2、syslog配置文件
syslog 設備依據兩個重要的文件:/etc/syslogd守護進程和/etc/syslog.conf配置文件。通常情況下,多數syslog信息被寫到 /var/adm或/var/log目錄下的信息文件中(messages.*)。一個典型的syslog記錄包括生成程序的名字和一個文本信息。它還包括一個設備和一個優先級范圍。
通過使用syslog.conf文件,可以對生成的日志的位置及其相關信息進行靈活的配置。該配置文件指明了syslogd守護程序記錄日志的行為,該程序在啟動時查詢配置文件。該文件由不同程序或消息分類的單個條目組成,每個占一行。對每類消息提供一個選擇域和一個動作域。這些域由tab隔開:
選擇域指明消息的類型和優先級;
動作域指明syslogd接收到一個與選擇標准相匹配的消息時所執行的動作。
syslog.conf行的基本語法是:
消息類型.優先級 動作域
其中,每個選擇域是由消息類型和優先級組成。當指明一個優先級時,syslogd將記錄一個擁有相同或更高優先級的消息。Linux中一些主要的消息類型如表2所示,表3列出了一些優先級信息:
表1 syslog消息類型
表2 syslog常用優先級
不同的服務類型有不同的優先級,數值較大的優先級涵蓋數值較小的優先級。如果某個選擇條件只給出了一個優先級而沒有使用任何優先級限定符,對應於這個優先級的消息以及所有更緊急的消息類型都將包括在內。比如說,如果某個選擇條件里的優先級是“warning”,它實際上將把“warning”、“err”、 “crit”、“alert“和“emerg”都包括在內。
syslog允許人們使用三種限定符對優先級進行修飾:星號(*)、等號(=)和嘆號(!):
星號(*)的含義是把本項服務生成的所有日志消息都發送到操作動作指定的地點。就像它在規則表達式里的作用一樣,星號代表“任何東西”。在前面給出的例子里,“mail.*”將把所有優先級的消息都發送到操作動作指定的/var/log/mail文件里。使用“*”限定符與使用“debug”優先級的效果完全一樣,后者也將把所有類型的消息發送到指定地點。
等號(=)的含義是只把本項服務生成的本優先級的日志消息都發送到操作動作指定的地點。比如說,可以用“=”限定符只發送調試消息而不發送其他更緊急的消息(這將為應用程序減輕很多負擔)。當你只需要發送特定優先級別的消息時,就要使用等號限定符。
嘆號(!)的含義是把本項服務生成的所有日志消息都發送到操作動作指定的地點,但本優先級的消息不包括在內。
所以,根據上面介紹的相關知識,我們給出如下例子作為示范:
(1)如果指明\"crit\",那所有標為crit、alert和emerg的消息將被記錄。每行的行動域指明當選擇域選擇了一個給定消息后應該把他發送到哪兒。例如,如果想把所有郵件消息記錄到一個文件中,如下所示:
#Log all the mail messages in one placemail.* /var/log/maillog
(2)其他設備也有自己的日志。UUCP和news設備能產生許多外部消息。它把這些消息存到自己的日志(/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將產生大量的消息。例如內核(\"kern\"設備)可能很冗長,用戶很難看得清楚明了,那么用戶可能想把內核消息記錄到/dev/console中。下面的例子表明內核日志記錄被注釋掉了:
#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下被調用的,缺省不使用選項。但有兩個選項-r和-h很有用:
如果將要使用一個日志服務器,必須調用syslogd -r。缺省情況下syslogd不接受來自遠程系統的信息。當指定-r選項,syslogd將會監聽從514端口上進來的UDP包。
如果還希望日志服務器能傳送日志信息,可以使用-h標志。缺省時,syslogd將忽略使其從一個遠程系統傳送日志信息到另一個系統的syslogd。
另外,如果需要重新啟動syslog守護進程(/etc/syslog.conf的修改只有在syslog守護進程重新啟動后才會生效),並且只想重新啟動syslog守護進程而不是整個系統,在Red Hat Linux機器上,執行以下兩條命令之一即可:
/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart/etc/rc.d/init.d/syslogrestart
4、靈活運用syslog調用接口
在實際的使用過程中,我們可以通過配置文件和查看相應的日志文件來使用syslog。然而,在許多應用場景下,我們往往需要通過程序產生輸出信息並進行記錄,也就是說要把一些信息寫成日志文件,正常情況下運行程序的人不用關心日志里的內容,只有在出現問題的時候才會查看日志文件里的內容以確定問題所在。因此,下面將詳細介紹如何通過syslog日志系統提供的API調用接口,來使用程序實現對syslog的使用。
1.主要的函數
在Linux中,提供了四個有關syslog日志系統的系統調用,供用戶使用:
openlog:打開日志設備,以供讀取和寫入,與文件系統調用的open類似;
syslog:寫入日志,與文件系統調用的write類似;
closelog:關閉日志設備,與文件系統調用的close類似;
vsyslog:它和syslog功能一樣,負責寫入日志,只是參數格式不同。
(1)openlog函數
該函數的聲明如下:
void openlog(const char *ident, int option, int facility);
此函數用來打開一個到系統日志記錄程序的連接,打開之后就可以用syslog或vsyslog函數向系統日志里添加信息了。而closelog函數就是用來關閉此連接的。
openlog 的第一個參數ident是一個標記,ident所表示的字符串將固定地加在每行日志的前面以標識這個日志,通常就寫成當前程序的名稱以作標記。第二個參數 option一般是下列選項值取“與”運算(使用“|”表示,如“LOG_CONS | LOG_PID”)的結果:
LOG_CONS:如果送到system logger時發生問題,直接寫入系統終端;
LOG_NDELAY:立即開啟連接,通常連接是在第一次寫入消息時才打開的;
LOG_PERROR:將消息也同時送到stderr設備;
LOG_PID:將進程PID含入所有消息中。
第三個參數facility指明記錄日志的程序的類型,它主要具有如下幾類日志類型:
LOG_AUTH :安全/授權消息
LOG_AUTHPRIV:安全/授權消息
LOG_CRON:時間守護進程(cron和at)專用
LOG_DAEMON:其它系統守護進程
LOG_KERN:核心消息
LOG_LOCAL0到LOG_LOCAL7:系統保留
LOG_LPR:printer子系統
LOG_MAIL:mail子系統
LOG_NEWS:USENET新聞子系統
LOG_SYSLOG:syslogd進程內部所產生的消息
LOG_USER(缺省):一般使用者缺省使用消息
LOG_UUCP:UUCP子系統
LOG_FTP:FTP子系統使用
(2)syslog函數
syslog函數的聲明如下:
void syslog(int priority, const char * message, ...);
第一個參數是消息的緊急級別priority,第二個參數是消息及其格式,之后是格式對應的參數,如同C語言里面printf輸出函數一樣使用,具體的格式這里就不再詳述,它不是本書介紹的重點。
這里還需要詳細介紹一下第一個參數priority,它是由severity level和facility組成的。Facility已經在上面介紹了,下面介紹一下severity level,也就是消息的重要級別,它主要包括:
LOG_EMERG:緊急狀況
LOG_ALERT:高優先級問題,比如說數據庫崩潰等,必須要立即采取反應行動
LOG_CRIT:重要狀況發生,比如硬件故障
LOG_ERR:錯誤發生
LOG_WARNING:警告發生
LOG_NOTICE:一般狀況,需要引起注意
LOG_INFO:信息狀況
LOG_DEBUG:調試消息
在實際使用中,如果我們的程序要使用系統日志功能,只需要在程序啟動時使用openlog函數來連接syslogd程序,后面隨時用syslog函數寫日志就行了。
(3)closelog函數
相對上述2個函數來說,該函數非常簡單,其聲明如下:
void closelog( void );
值得注意的是,雖然該函數的使用和調用情況非常簡單,但是是必不可少的,因為在Linux系統中,打開的日志也是資源,如果只使用openlog函數打開日志,而忘記使用closelog關閉日志的話,當打開的日志數量累積到一定程度,便會造成內存不足,從而引起系統問題。所以,提醒用戶在使用中特別注意。
2.一個實際的程序調用例子
下面給出一個使用上述幾個函數寫日志的例子,以供大家參考:
#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();
}
轉自 http://weisjohn.blog.163.com/blog/static/310152562012326113450226/