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
【引申】fprintf函數可以將結果輸出到指定的流,如stdout, stderr以及stdin,或者是某個具體的文件流
摘自 陳立龍的專欄