轉載:http://blog.chinaunix.net/uid-26583794-id-3166083.html
守護進程日誌的實現
syslogd守護進程用於解決守護進程的日誌記錄問題,而日誌信息保存的位置和記錄的信息級別是在syslogd守護進程的配置文件中設定的。守護進程日誌主要涉及3個函數,分別是openlog、syslog和closelog函數。表8.4所示爲這3個函數的具體信息。
表8.4 openlog、syslog和closelog函數
頭文件 |
<syslog.h> |
||
函數形式 |
void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); |
||
|
|
|
|
|
|
|
說明:調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用於與syslog守護進程通信的描述符。調用openlog 使我們可以指定一個ident,以後, 此ident 將被加至每則記錄消息中。ident 一般是程序的名稱(例如 ,cron ,ine 等)
openlog函數中的第1個參數爲ident,該參數常用來表示信息的來源。ident指向的字符信息會被固定地添加在每行日誌的前面。第2個參數option用於指定openlog函數和接下來調用的syslog函數的控制標誌。option的取值情況如表8.5所示,可以單獨取其中的某個值,也可以通過與運算來獲得多種特性。第3個參數爲facility,這個要與syslogd守護進程的配置文件對應,日誌信息會寫入syslog.conf文件指定的位置。
表8.5 openlong函數中的option取值表
參 數 |
說 明 |
LOG_CONS |
如果將信息發送給syslogd守護進程時發生錯誤,直接將相關信息輸出到終端 |
LOG_NDELAY |
立即打開與系統日誌的連接(通常情況下,只有在產生第一條日誌信息的情況下才會打開與日誌系統的連接) |
LOG_NOWAIT |
在記錄日誌信息時,不等待可能的子進程的創建 |
LOG_ODELAY |
類似於LOG_NDELAY參數,與系統日誌的連接只有在syslog函數調用時纔會創建 |
參 數 |
說 明 |
LOG_PERROR |
在將信息寫入日誌的同時,將信息發送到標準錯誤輸出(POSIX.1-2001不支持該參數) |
LOG_PID |
每條日誌信息中都包括進程號 |
參數facility的取值如表8.6所示。這些值與前面syslog.conf中的facility是存在對應關係的。
表8.6 openlog函數參數facility取值
facility參數 |
syslog.conf中對應的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 |
syslog函數中的第一個參數priority表示消息的級別。與openlog函數中的facility參數類似,priority參數與level也存在對應的關係。priority取值和對應關係如表8.7所示。
表8.7 syslog函數參數priority取值
priority參數 |
syslog.conf中對應的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 |
syslog函數的第二個參數爲消息的格式,之後是格式對應的參數。函數的使用類似於printf函數。
參考代碼如下:
點擊(此處)摺疊或打開
-
#include <syslog.h>
-
-
int main(int argc, char **argv)
-
{
-
syslog(LOG_ERR|LOG_USER,"test
- %m/n");
-
openlog("SyslogTest", LOG_CONS | LOG_PID, 0);
-
syslog(LOG_DEBUG,"This is a syslog test message generated by program '%s'/n",argv[0]);
-
closelog();
-
return 0;
- }
執行結果:#cat /var/log/syslog