2.1.2 syslog系統構架

先介紹klogd是因爲當一開始寫入/var/log/message時,klogd所記錄的信息會比syslogd 的順序優先,原因是klogd所記錄的是尚未進入操作系統的信息,但其實一開始的這些信息並不是由klogd所記錄的,而是自加載kernel 時,就已經開始記錄的。在系統尚未進入操作系統階段,還在加載kernel及執行initrd時,會將信息先記錄在/proc/kmsg文件中(因爲在 initrd階段沒有實體硬盤可供記錄),等進入操作系統執行完klogd後,klogd再將/proc/kmsg的所有內容全數填入/var/log /message文件中,這也是爲何在/var/log/message文件的一開始,依然可以看到剛開機在加載kernel以及initrd階段的信息 (如圖5-13中連CPU的啓用都看得到,信息中也註明了是kernel的信息)。

 

在klogd填入所有kernel加載及initrd階段的信息之後,就進入下面介紹klogd時所描述的行爲。

 

from << Linux安全體系分析與編程 >>   倪繼利

2.1.2  syslog系統構架

內核和任何程序都可通過syslog系統記錄事件消息,並將消息寫入到一個文件或設備中,還可以通過網絡進行傳送。syslog系統構架如圖2-1 所示。

在圖2-1中,klogd後臺進程監聽和得到內核信息,併發送到syslogd後臺進程。syslogd監聽和處理來自syslog庫API的所有 消息,並輸出到控制檯或指定文件中。

在內核,函數printk將消息寫入到一個長度爲LOG_BUF_LEN字節的循環緩衝區中。如果循環緩衝區填滿了,printk就繞回緩衝區的開 始處填寫新數據,klogd後臺進程讀取循環緩衝區中內核消息,並分發到syslogd。

1.系統調用sys_syslog

頭文件sys/klog.h提供了系統調用sys_syslog,它從內核的printk環形緩衝區讀取的消息。當環形緩衝區爲空時,它會阻塞等 待。

2.後臺進程klogd

後臺進程klogd調用sys syslog讀取內核的消息。klogd允許內核消息打印在系統終端上,優先級小於7的任何消息都可在終端上打印。優先級爲7的消息是調試消息,不能出現 在終端上,將由syslogd後臺定向到文件中。

由內部錯誤條件引發的消息是非常重要的,開發者需要分析這些消息來判定出錯的原因。錯誤消息以原始數據出現,需要通過符號表映射文件轉換成可讀的符 號信息。程序編譯時會產生符號表映射文件,它列出了重要變量和函數的地址位置。內核編譯產生的符號映射文件爲system.map,後臺進程klogd通 過system.map文件將原始數據轉成符號信息;然後,在系統終端打印或通過syslog庫函數傳遞給syslogd後臺。

如果沒有運行klogd,數據將保留在循環緩衝區中,直到某個進程讀取或緩衝區溢出爲止。

還可通過讀取/proc/kmesg文件獲得調試信息。對/proc/kmesg進行讀操作時,日誌緩衝區中被讀取的數據就不再保留,而sys syslog系統調用卻能隨意地返回日誌數據,並保留這些數據以便其他進程也能使用。

klogd指定-f (file)選項,可將消息保存到某個特定的文件中,還可修改/etc/syslog.conf來設置消息存放地點。

3.syslog庫API

syslog庫API在syslog.h文件中定義,它提供了函數openlog、syslog和closelog用來將應用程序中的日誌消息寫入 日誌系統。例如:應用程序su的打印日誌消息函數列出如下:

#include 

#include "system.h"

# include



static void log_su (struct passwd const *pw, bool successful)

{

const char *new_user, *old_user, *tty;



new_user = pw->pw_name;

old_user = getlogin ();//通過日誌文件utmp得到登錄的用戶

if (!old_user) //如果沒得到用戶名,就通過uid獲取

{

struct passwd *pwd = getpwuid (getuid ());

old_user = (pwd ? pwd->pw_name : "");

}

tty = ttyname (STDERR_FILENO);//通過標準描述符STDERR_FILENO得到控制檯名

if (!tty)

tty = "none";



 // base_name (program_name)表示用程序的基本名字作爲消息標籤頭

openlog (base_name (program_name), 0 , LOG_AUTH ); // LOG_AUTH表示安全或授權消息

 //打印消息

syslog (LOG_NOTICE,//消息優先級

"%s(to %s) %s on %s",

successful ? "" : "FAILED SU ",

new_user,

old_user, tty);

closelog (); //關閉

}

4.後臺進程syslogd

後臺進程syslogd根據配置文件/etc/syslog.conf將消息輸出到指定存放地點。配置文件syslog.conf定義每類消息的存 放地點。通常情況下,syslog信息寫入到/var/adm或/var/log目錄下的信息文件(messages.*)中。一個典型的syslog記 錄包括生成程序的名字和一個文本信息。

syslog.conf文件的每一行對每類消息都提供一個選擇域和一個動作域,由tab隔開;選擇域指明消息的類型和優先級,動作域指明 syslogd執行的動作。

例如,下面配置表示所有郵件消息記錄到一個文件中:

#Log all the mail messages in one place 

mail.* /var/log/maillog

下面配置表示將alert消息寫入到root和tiger的個人賬號中:

#Root and Tiger get alert and higher messages 

*.alert root,tiger

下面配置表示將內核消息記錄到設置/dev/console中:

#Log all kernel messages to the console 

#Logging much else clutters up the screen

kern.* /dev/console

下面配置表示將UUCP和news設備產生的錯誤消息寫入到指定的日誌文件中:

# Save news errors of level crit and higher in a special file. 

uucp,news.crit /var/log/spooler

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