printk根據(jù)日志級別(loglevel)對消息進(jìn)行分類,。日志級別用宏定義,,日志級別宏展開為一個(gè)字符串,,在編譯時(shí)由預(yù)處理器將它和消息文本拼接成一個(gè)字符串,,因此printk 函數(shù)中日志級別宏和格式字符串間不能有逗號。 下面是兩個(gè)printk的例子,,一個(gè)用于打印調(diào)試信息,,另一個(gè)用于打印臨界條件信息。 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中):
日志級別的范圍是0~7,,沒有指定日志級別的printk語句默認(rèn)采用的級別是 DEFAULT_ MESSAGE_LOGLEVEL,,其定義列出如下(在linux26/kernel/printk.c中):
內(nèi)核可把消息打印到當(dāng)前控制臺上,可以指定控制臺為字符模式的終端或打印機(jī)等,。默認(rèn)情況下,,“控制臺”就是當(dāng)前的虛擬終端。 為了更好地控制不同級別的信息顯示在控制臺上,,內(nèi)核設(shè)置了控制臺的日志級別console_loglevel,。printk日志級別的作用是打印一定級別的消息,與之類似,控制臺只顯示一定級別的消息,。 當(dāng)printk的日志級別小于console_loglevel時(shí),,消息才能顯示出來,??刂婆_相應(yīng)的日志級別定義如下:
如果系統(tǒng)運(yùn)行了klogd和syslogd,則無論console_loglevel為何值,,內(nèi)核消息都將追加到/var/log/messages中,。如果klogd沒有運(yùn)行,消息不會傳遞到用戶空間,,只能查看/proc/kmsg,。 變量console_loglevel的初始值是DEFAULT_CONSOLE_LOGLEVEL,可以通過sys_syslog系統(tǒng)調(diào)用進(jìn)行修改,。調(diào)用klogd時(shí)可以指定-c開關(guān)選項(xiàng)來修改這個(gè)變量,。如果要修改它的當(dāng)前值,必須先殺掉klogd,,再加-c選項(xiàng)重新啟動(dòng)它,。 注:#ps -e 查看所有進(jìn)程PID,然后KILL,。
上面顯示的4個(gè)數(shù)據(jù)分別對應(yīng)控制臺日志級別、默認(rèn)的消息日志級別,、最低的控制臺日志級別和默認(rèn)的控制臺日志級別,。 可用下面的命令設(shè)置當(dāng)前日志級別: # echo 8 > /proc/sys/kernel/printk |
|