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

五、printk正確用法
5.1基本語法
#include
5.2避坑事項
別濫用KERN_DEBUG:調試完成后一定要刪除或注釋,否則會占用內核緩沖區,影響系統性能;
關鍵錯誤用高等級:比如驅動加載失敗、硬件異常,必須用KERN_ERR(3級),而不是KERN_INFO(6級),避免被過濾;
六、總結
printk輸出等級是Linux內核日志的優先級管理系統,8個等級+ 4個核心參數共同決定了日志的輸出行為。
核心邏輯如下:數值越小,優先級越高;控制臺日志級別≥日志等級時,才會實時輸出;調試用KERN_DEBUG+級別7,生產環境用KERN_ERR+級別3~4。
掌握了printk的日志級別機制,不管是內核調試還是驅動開發,都能精準定位問題。下次遇到內核相關的排障需求,不妨試試這些技巧,效率絕對翻倍~
如果覺得有用,記得點贊收藏并關注我們公眾號,轉發給身邊做Linux開發的朋友!
-
驅動開發
+關注
關注
0文章
140瀏覽量
12637 -
LINUX內核
+關注
關注
1文章
321瀏覽量
23201 -
RK3588
+關注
關注
8文章
556瀏覽量
7320
發布評論請先 登錄
linux內核打印函數printk的方法
Linux內核模塊介紹,使用Linux模塊的優點
如何配置和使用Linux內核printk功能
你知道Linux內核調試關鍵技術之一的printk?
Linux中的Printk與dmesg功能
介紹一下linux內核比較優秀的調試方式KGDB
Linux內核中如何修改printk等級
Linux內核printk日志級別全解析:從參數解讀到實操配置
Linux內核日志玩明白了嗎?printk調試神器全解析
評論