先介紹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階段的資訊之後,接著執行的就是這一節所提到的服務級程式,而這些程式所產生的資訊,就由 syslogd負責整理,所以,這些資訊會直接加在剛剛klogd的資訊後面。在進入作業系統後klogd將資訊派發給syslogd,syslogd就直接依/etc/syslog.conf檔案的定義,寫入/var/log/message資訊檔案。
from <> 倪繼利
函式printk的使用方法和printf相似,用於核心列印訊息。printk根據日誌級別(loglevel)對訊息進行分類。
日誌級別用巨集定義,日誌級別巨集展開為乙個字串,在編譯時由預處理器將它和訊息文字拼接成乙個字串,因此printk 函式中日誌級別巨集和格式字串間不能有逗號。
下面是兩個printk的例子,乙個用於列印除錯資訊,另乙個用於列印臨界條件資訊。
printk(kern_debug "here i am: %s:%i/n", _ _file_ _, _ _line_ _);printk(kern_crit "i'm trashed; giving up on %p/n", ptr);
printk的日誌級別定義如下(在linux26/includelinux/kernel.h中):
#definekern_emerg"<0>"/*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/#definekern_alert"<1>"/*報告訊息,表示必須立即採取措施*/
#definekern_crit"<2>"/*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/
#definekern_err"<3>"/*錯誤條件,驅動程式常用kern_err來報告硬體的錯誤*/
#definekern_warning"<4>"/*警告條件,對可能出現問題的情況進行警告*/
#definekern_notice"<5>"/*正常但又重要的條件,用於提醒。常用於與安全相關的訊息*/
#definekern_info"<6>"/*提示資訊,如驅動程式啟動時,列印硬體資訊*/
#definekern_debug"<7>"/*除錯級別的訊息*/
extern int console_printk;
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
日誌級別的範圍是0~7,沒有指定日誌級別的printk語句預設採用的級別是 default_ message_loglevel,其定義列出如下(在linux26/kernel/printk.c中):
/*沒有定義日誌級別的printk使用下面的預設級別*/#define default_message_loglevel 4 /* kern_warning 警告條件*/
核心可把訊息列印到當前控制台上,可以指定控制台為字元模式的終端或印表機等。預設情況下,「控制台」就是當前的虛擬終端。
為了更好地控制不同級別的資訊顯示在控制台上,核心設定了控制台的日誌級別console_loglevel。printk日誌級別的作用是列印一 定級別的訊息,與之類似,控制台只顯示一定級別的訊息。
當日誌級別小於console_loglevel時,訊息才能顯示出來。控制台相應的日誌級別定義如下:
/* 顯示比這個級別更重發的訊息*/#define minimum_console_loglevel 1 /*可以使用的最小日誌級別*/
#define default_console_loglevel 7 /*比kern_debug 更重要的訊息都被列印*/
int console_printk[4] = ;
如果系統執行了klogd和syslogd,則無論console_loglevel為何值,核心訊息都將追加到/var/log /messages中。如果klogd沒有執行,訊息不會傳遞到使用者空間,只能檢視/proc/kmsg。
變數console_loglevel的初始值是default_console_loglevel,可以通過sys_syslog系統呼叫進行修 改。呼叫klogd時可以指定-c開關選項來修改這個變數。如果要修改它的當前值,必須先殺掉klogd,再加-c選項重新啟動它。
通過讀寫 /proc/sys/kernel/printk檔案可讀取和修改控制台的日誌級別。檢視這個檔案的方法如下:
#cat /proc/sys/kernel/printk6 4 1 7
上面顯示的4個資料分別對應控制台日誌級別、預設的訊息日誌級別、最低的控制台日誌級別和預設的控制台日誌級別。
可用下面的命令設定當前日誌級別:
# echo 8 > /proc/sys/kernel/printk
printk 函式的使用 控制台改變顯示訊息級別
printk 函式的使用 printk 函式的總結 我們在使用printk 函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。對程式的除錯起到了很重要的作用。下文中的日誌級別和控制台日誌控制級別是乙個意思 printk 日誌級別 訊息文字 這...
沒有控制台視窗的控制台程式
include include pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 編譯後執行程式會彈出乙個訊息框,而沒有背後的控制台視窗。再看看下面的 include in...
控制台訊息的產生及處理
學過視窗程式的朋友都會知道訊息的概念,也知道如何處理訊息 系統訊息或是自定義訊息 但是其實我們的控制台程式也是有訊息的,下面我們來看看控制台程式的訊息的產生及處理 首先我向大家介紹兩個函式 setconsolectrlhandler bool winapi setconsolectrlhandler...