openlog、syslog和closelog函數

轉載: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

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函數。

參考代碼如下:

點擊(此處)摺疊或打開

  1. #include <syslog.h> 

  2. int main(int argc, char **argv) 
  3. { 
  4.     syslog(LOG_ERR|LOG_USER,"test - %m/n"); 
  5.     openlog("SyslogTest", LOG_CONS | LOG_PID, 0); 
  6.     syslog(LOG_DEBUG,"This is a syslog test message generated by program '%s'/n",argv[0]); 
  7.     closelog(); 
  8.     return 0; 
  9. }

執行結果:#cat /var/log/syslog

QQ截圖20120408210028

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章