前言:
做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
| action must be taken immediately
| 必须立即处理的警报
| 关键资源耗尽、权限验证失败
|
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条评论
快来发表一下你的评论吧 !