printk的loglevel和日誌記錄分析
(分析版本是ubuntu7.10,核心原始碼是2.6.23)
首先,printk有8個loglevel,定義在中,其中數值範圍從0到7,數值越小,優先順序越高。
#definekern_emerg"<0>"/* system is unusable*/
系統崩潰
#definekern_alert"<1>"/* action must be taken immediately*/
必須緊急處理
#definekern_crit"<2>"/* critical conditions*/
臨界條件,嚴重的硬軟體
錯誤#definekern_err"<3>"/* error conditions*/
報告錯誤
#definekern_warning"<4>"/* warning conditions*/
警告#definekern_notice"<5>"/* normal but significant condition*/
普通但還是須注意
#definekern_info"<6>"/* informational*/
資訊#definekern_debug"<7>"/* debug-level messages*/
除錯資訊
從這裡也可以看出他們的優先順序是數值越小,其緊急和嚴重程度就越高。
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])
未指定優先順序的預設級別定義在/kernel/printk.c中:
/* printk's without a loglevel use this.. */
#define default_message_loglevel 4 /* kern_warning */
/* we show everything that is more important than this.. */
#define minimum_console_loglevel 1 /* minimum loglevel we let people use */
#define default_console_loglevel 7 /* anything more serious than kern_debug */
int console_printk[4] = ;
當優先順序的值小於
console_loglevel
這個整數變數的值,資訊才能顯示出來。而
console_loglevel
的初始值
default_console_loglevel
也定義在
/kernel/printk.c中:
cat /proc/sys/kernel/printk
4417
這個預設值是在
sysctl.conf
中寫的,在系統啟動時就把這個值寫到
/proc/sys/kernel/printk
這個檔案了。也可以使用下面的命令修改其值
echo 0 > /proc/sys/kernel/printk
cat /proc/sys/kernel/printk
0417
它們根據日誌記錄訊息的重要性,定義將其傳送到何處。關於不同日誌級別的更多資訊,請閱讀
syslog(2)
聯機幫助頁。該檔案的四個值為:
控制台日誌級別:優先順序高於該值的訊息將被列印至控制台
預設的訊息日誌級別:將用該優先順序來列印沒有優先順序的訊息
最低的控制台日誌級別:控制台日誌級別可被設定的最小值(最高優先順序)
預設的控制台日誌級別:控制台日誌級別的預設值
以下是我的測試程式和作的相關的測試。
#include
#include
#include
static int __init pinit(void)
static void __exit pexit(void)
module_init(pinit);
module_exit(pexit);
在這裡我只觀察了四個比較重要的日誌檔案:
messages
,kern.log
,syslog
,debug
。這四個檔案都在
/var/log/
這個目錄下。它的日誌檔案經觀察未出現這些
printk
資訊。cat /proc/sys/kernel/printk
4
417
在上面這種情況下日誌檔案的變化情況是:
lkern.log
:紀錄了級別是0—
7包括<8>
的所有資訊,在這些紀錄當中,其中
<8>
的紀錄是這樣的。
<8>goodluck8!
lmessages
:只是記錄了
456和
<8>。l
syslog
:記錄和
kern.log
一樣。l
debug
:之記錄級別是
7的資訊。
cat /proc/sys/kernel/printk
0417
在上面這種情況下日誌檔案的變化情況是:
lkern.log
:紀錄了級別是0—
7包括<8>
的所有資訊,在這些紀錄當中,其中
<8>
的紀錄是這樣的。
<8>goodluck8!
lmessages
:只是記錄了
456和
<8>。l
syslog
:記錄和
kern.log
一樣。l
debug
:之記錄級別是
7的資訊。
cat /proc/sys/kernel/printk
7417
lkern.log
:紀錄了級別是0—
7包括<8>
的所有資訊,在這些紀錄當中,其中
<8>
的紀錄是這樣的。
<8>goodluck8!
lmessages
:只是記錄了
456和
<8>。l
syslog
:記錄和
kern.log
一樣。l
debug
:之記錄級別是
7的資訊。
分析結論:在作業系統
是圖形化的介面下測試證明
-日誌記錄和終端級別是沒有關係的,但是在文字介面下的結果和這裡是不太一樣的,根據不同的設定有些資訊會輸出到終端。這裡就不多說了。
其次有關於系統的日誌記錄工具有兩種主要的:
syslog
和klog
。linux
系統中/etc/init.d/sysklogd
會啟動2
個守護程序
:klogd, syslogd
。syslog
是unix
系統的乙個常見元件,用於執行系統日誌記錄活動。
syslogd
是它的守護程序。
syslogd
從一組日誌源(如
/dev/log
和/dev/klog
)中讀取資料,並按照
/etc/syslog.conf
中的說明處理這些日誌訊息。通過呼叫
syslog()
,可將應用程式日誌訊息記錄到
syslog
中。syslog
訊息採用一種包含可選優先順序和裝置的標準格式。優先順序指示訊息的緊急程度。裝置指示發布
訊息的子系統。
/usr/include/syslog.h
中定義了它的優先順序和裝置資源。
klog
是乙個從
unix
核心接受訊息的裝置
klogd
守護程序獲得並記錄
linux
核心資訊。通常,
syslogd
會記錄klogd
傳來的所有核心資訊。
syslogd
的配置檔案是
/etc/syslog.conf
。下面是我機子上這個檔案的部分內容。主要是對
debug
和messages
檔案要記錄內容的設定。
*.=debug;/
auth,authpriv.none;/
news.none;mail.none-/var/log/debug
*.=info;*.=notice;*.=warn;/
auth,authpriv.none;/
cron,daemon.none;/
mail,news.none-/var/log/messages
Angular2中loglevel的使用教程
大三的php課上,老師現場找bug,一邊找一邊給我們說,大家以後可以用alert 這個函式來幫助調程式,於是養成了想檢視某個值的時候就alert一下的習慣,but!事實上,工程上更多的使用的是log的方式,一般用console.log 但是缺點是,不能對log們進行篩選,於是有了各種log的輪子,l...
printk 函式的總結
不過在有些機器上執行得到的結果並不是這樣的 即一般情況下,syslog和kern.log兩個檔案中記錄的內容從程式設計這個角度來看是基本一致的。在目錄 var log 下有一下四個檔案可以檢視日誌 syslog kern.log,messages debug syslog和kern.log一般情況下...
printk 函式的總結
我們在使用printk 函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。對程式的除錯起到了很重要的作用。下文中的日誌級別和控制台日誌控制級別是乙個意思 printk 日誌級別 訊息文字 這裡的日誌級別通俗的說指的是對文字資訊的一種輸出範圍上...