引用自:http://blog.chinaunix.net/uid-26675482-id-3130583.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
1. BSD syslogd的組成結構:
從上圖可以看到相關的日志文件主要來源於三種途徑:
(1) 內核:
許多內核例程調用log函數產生log消息,另外klogd守護進程能夠監聽並得到內核消息,並發送給syslogd進程。
(2) 許多用戶進程直接調用syslog函數產生日志消息。
(3) 來自於TCP/IP網絡連接的日志消息。該消息可能來自於自身的某個用戶進程或者其它網絡主機上的一個用戶進程。端口是514.
我們主要討論第二種情況下產生的日志消息。跟syslog相關的主要以下三個函數:
openlog:
ident主要被用於加在日志消息中,一般是用某個程序名來代替。如cron, inetd等。
option則是許多選項的位屏蔽,常見的選項見下表:
facility參數設置的目的是可以通過配置文件對不同設施的消息將以不同的方式進行處理。常見的facility見下表:
openlog(“dhcp6c”, LOG_NDELAY|LOG_PID, LOG_DAEMON);
syslog:
priority參數可以是facility與level的組合,其中level可取的值如下表:
syslog(LOG_ERR, “open error for %s: %m”, filename)
syslog(LOG_ERR|LOG_LPR, “open error for %s: %m”, filename)
format則是格式化的出錯消息字符串。
setlogmask: 用來設置記錄日志的優先級,即只記錄指定優先級的日志消息。
setlogmask(LOG_ERR) ----- 僅僅記錄ERR級別的日志消息
setlogmask(LOG_UPTO(LOG_ERR))----- 記錄ERR以及之前的所有日志消息
syslogd配置文件:(/etc/syslog.conf)
主要用來控制如何處理facility|priority的log消息,如存放到某個指定的文件中,或者發送到指定的log服務器,
2. 內核消息日志的顯示以及printk函數的日志級別:
從前面的圖2-1中可以看到,函數printk先將消息打印到環形緩沖區_logbuf中,並將消息傳給控制台進行顯示,控制台驅動程序然后根據控制台的日志級別顯示日志消息。
常見的日志級別如下表:(數字越低,代表級別越高!)
跟日志級別相關的幾個常量:
#defineconsole_loglevel (console_printk[0]) 控制台的日志級別,凡是優先級高於這個值的消息將在控制台上顯示。它的初始值是default_console_loglevel,這個值可以通過 klogd –cn(n為設置的級別)進行修改,不過要注意的是在修改之前,必須先殺掉klogd進程。 #define default_message_loglevel (console_printk[1]) 默認消息日志級別,當printk沒定義優先級時使用這個值 #define minimum_console_loglevel (console_printk[2]) 最小控制台日志級別,控制台日志級別可被設置的最小值 #define default_console_loglevel (console_printk[3]) 默認的控制台日志級別,這個值可以通過sys_syslog系統調用進行修改。 Ps:這四個常量值可以通過/proc/sys/kernel/printk文件進行查看和修改。可以通過以下方式修改當前的日志級別: echo 8 > /proc/sys/kernel/printk