前言:
做Linux驅(qū)動開發(fā)或內(nèi)核調(diào)試的朋友,一定對printk不陌生,但你真的會用它嗎?為什么同樣是調(diào)試RK3588內(nèi)核,別人能精準(zhǔn)捕捉關(guān)鍵錯誤,你卻被海量日志淹沒?今天就帶大家吃透printk的日志等級機制,從參數(shù)配置到實戰(zhàn)用法一次講透~
一、printk與printf的差異
用戶態(tài)的printf大家都熟,直接打印內(nèi)容,簡單粗暴。但內(nèi)核場景更復(fù)雜,系統(tǒng)崩潰或是debug調(diào)試細(xì)節(jié),不同信息的重要性天差地別。如果所有日志一鍋端,關(guān)鍵錯誤就容易被淹沒。
printk的核心就是給日志加了"優(yōu)先級標(biāo)簽",解決兩個核心問題:
控制輸出渠道
只有日志等級≥內(nèi)核“控制臺日志級別”時,才會實時打印到控制臺(串口/終端);否則僅存入內(nèi)核緩沖區(qū)(需用dmesg查看)。
區(qū)分信息重要性
從致命崩潰到調(diào)試細(xì)節(jié),8個等級可以快速定位關(guān)鍵問題,比如優(yōu)先關(guān)注錯誤級日志,忽略調(diào)試級冗余信息。
例如眺望電子RK3588 Linux6.1內(nèi)核在中定義了8個標(biāo)準(zhǔn)輸出等級,數(shù)值 0~7,數(shù)值越小優(yōu)先級越高(0級為系統(tǒng)崩潰級,7級為調(diào)試級)。每個等級都有明確的使用場景,對應(yīng)關(guān)系如下:
等級宏 | 數(shù)值 | 英文含義 | 中文說明 | 典型場景 |
KERN_EMERG | 0 | system is unusable | 緊急情況(系統(tǒng)不可用) | 內(nèi)核崩潰、致命硬件錯誤 |
KERN_ALERT | 1 | 必須立即處理的警報 | 關(guān)鍵資源耗盡、權(quán)限驗證失敗 | |
KERN_CRIT | 2 | critical conditions | 嚴(yán)重錯誤 | 文件系統(tǒng)損壞、進程調(diào)度異常 |
KERN_ERR | 3 | error conditions | 普通錯誤 | 驅(qū)動初始化失敗、函數(shù)調(diào)用關(guān)鍵錯誤 |
KERN_WARNING | 4 | warning conditions | 警告(潛在問題) | 參數(shù)非法、內(nèi)存分配警告 |
KERN_NOTICE | 5 | normal but significant condition | 通知(重要正常事件) | 模塊加載/卸載、系統(tǒng)啟動關(guān)鍵步驟 |
KERN_INFO | 6 | informational | 信息性消息 | 驅(qū)動版本、硬件探測結(jié)果 |
KERN_DEBUG | 7 | debug-level messages | 調(diào)試消息 | 開發(fā)者調(diào)試 |
二、4個printk核心參數(shù)
終端執(zhí)行以下指令:
cat/proc/sys/kernel/printk
這串?dāng)?shù)字不是隨機的,而是內(nèi)核日志系統(tǒng)的“核心配置開關(guān)”,它直接決定了printk的日志輸出行為。輸出的4 4 1 7,這 4 個參數(shù)順序固定,分別對應(yīng)內(nèi)核日志的4個核心配置。
控制臺日志級別:4
這決定了哪些日志會實時輸出到控制臺。當(dāng)日志等級≤該值時,直接打印到控制臺,數(shù)值越大,輸出越全。
默認(rèn)消息日志級別:4
當(dāng)printk未顯式指定等級時,自動使用的默認(rèn)等級。
最小控制臺日志級別:1
限制控制臺日志級別的最低值,避免誤操作將級別設(shè)為0,導(dǎo)致遺漏關(guān)鍵日志。
默認(rèn)控制臺日志級別:7
內(nèi)核啟動時的默認(rèn)控制臺級別,也作為重置參考值。
三、日志級別配置
根據(jù)場景調(diào)整日志級別,給大家分享如下兩種配置方法:
3.1臨時修改
想看到所有日志(包括調(diào)試信息):echo 7 > /proc/sys/kernel/printk
只看錯誤及以上(過濾無關(guān)信息):echo 3 > /proc/sys/kernel/printk(僅顯示0~3級)
恢復(fù)默認(rèn)配置:echo 4 4 1 7 > /proc/sys/kernel/printk
3.2永久修改
臨時修改重啟就沒了,永久修改需寫入配置文件/etc/sysctl.conf:
1. 編輯/etc/sysctl.conf,添加一行:kernel.printk = 4 4 1 7(數(shù)值可按需調(diào)整)
2. 執(zhí)行sysctl -p,讓配置立即生效
四、日志查看技巧
實時查看控制臺日志
直接在終端觀察,僅顯示符合級別要求的日志。
查看內(nèi)核緩沖區(qū)日志
dmesg指令可以顯示所有等級日志,包括未輸出到控制臺的,搭配過濾更高效:dmesg |grep"ERR" # 篩選錯誤級日志dmesg -w # 實時監(jiān)控日志
查看持久化日志文件
多數(shù)linux系統(tǒng)發(fā)行版會將內(nèi)核日志寫入/var/log/kern.log,可用tail實時跟蹤:

五、printk正確用法
5.1基本語法
#include
5.2避坑事項
別濫用KERN_DEBUG:調(diào)試完成后一定要刪除或注釋,否則會占用內(nèi)核緩沖區(qū),影響系統(tǒng)性能;
關(guān)鍵錯誤用高等級:比如驅(qū)動加載失敗、硬件異常,必須用KERN_ERR(3級),而不是KERN_INFO(6級),避免被過濾;
六、總結(jié)
printk輸出等級是Linux內(nèi)核日志的優(yōu)先級管理系統(tǒng),8個等級+ 4個核心參數(shù)共同決定了日志的輸出行為。
核心邏輯如下:數(shù)值越小,優(yōu)先級越高;控制臺日志級別≥日志等級時,才會實時輸出;調(diào)試用KERN_DEBUG+級別7,生產(chǎn)環(huán)境用KERN_ERR+級別3~4。
掌握了printk的日志級別機制,不管是內(nèi)核調(diào)試還是驅(qū)動開發(fā),都能精準(zhǔn)定位問題。下次遇到內(nèi)核相關(guān)的排障需求,不妨試試這些技巧,效率絕對翻倍~
如果覺得有用,記得點贊收藏并關(guān)注我們公眾號,轉(zhuǎn)發(fā)給身邊做Linux開發(fā)的朋友!
-
驅(qū)動開發(fā)
+關(guān)注
關(guān)注
0文章
140瀏覽量
12536 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
319瀏覽量
23076 -
RK3588
+關(guān)注
關(guān)注
8文章
503瀏覽量
7098
發(fā)布評論請先 登錄
Linux內(nèi)核學(xué)習(xí)筆記:printk調(diào)試
Linux內(nèi)核調(diào)試方法的總結(jié)
linux內(nèi)核打印函數(shù)printk的方法
Linux內(nèi)核模塊介紹,使用Linux模塊的優(yōu)點
如何配置和使用Linux內(nèi)核printk功能
內(nèi)核日志及printk結(jié)構(gòu)淺析
你知道Linux內(nèi)核調(diào)試關(guān)鍵技術(shù)之一的printk?
Linux中的Printk與dmesg功能
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
內(nèi)核調(diào)試利器printk的使用心得
介紹一下linux內(nèi)核比較優(yōu)秀的調(diào)試方式KGDB
Linux內(nèi)核中如何修改printk等級
內(nèi)核調(diào)試工具printkprintk的輸出格式
Linux內(nèi)核printk日志級別全解析:從參數(shù)解讀到實操配置

Linux內(nèi)核日志玩明白了嗎?printk調(diào)試神器全解析
評論