• 正文
  • 相关推荐
申请入驻 产业图谱

Linux内核日志玩明白了吗?printk调试神器全解析

2小时前
118
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言:

Linux驱动开发或内核调试的朋友,一定对printk不陌生,但你真的会用它吗?为什么同样是调试RK3588内核,别人能精准捕捉关键错误,你却被海量日志淹没?今天就带大家吃透printk的日志等级机制,从参数配置到实战用法一次讲透~

一、printk与printf的差异

用户态的printf大家都熟,直接打印内容,简单粗暴。但内核场景更复杂,系统崩溃或是debug调试细节,不同信息的重要性天差地别。如果所有日志一锅端,关键错误就容易被淹没。

printk的核心就是给日志加了"优先级标签",解决两个核心问题:

控制输出渠道

只有日志等级≥内核“控制台日志级别”时,才会实时打印到控制台(串口/终端);否则仅存入内核缓冲区(需用dmesg查看)。

区分信息重要性

从致命崩溃到调试细节,8个等级可以快速定位关键问题,比如优先关注错误级日志,忽略调试级冗余信息。

例如眺望电子RK3588 Linux6.1内核在<linux/kern_levels.h>中定义了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
 <linux/kern_levels.h>   // 包含等级宏定义
// 错误级日志:驱动初始化失败
printk(KERN_ERR "网卡驱动初始化失败:设备节点不存在n");
// 调试级日志:打印变量值
printk(KERN_DEBUG "缓冲区大小:%d 字节n", buf_size);
// 未指定等级(默认KERN_WARNING)
printk("参数校验警告:数值超出范围n");

 5.2  避坑事项

  • 别滥用KERN_DEBUG:调试完成后一定要删除或注释,否则会占用内核缓冲区,影响系统性能;
  • 关键错误用高等级:比如驱动加载失败、硬件异常,必须用KERN_ERR(3级),而不是KERN_INFO(6级),避免被过滤;

六、总结

printk输出等级是Linux内核日志的优先级管理系统,8个等级+ 4个核心参数共同决定了日志的输出行为。

核心逻辑如下:数值越小,优先级越高;控制台日志级别≥日志等级时,才会实时输出;调试用KERN_DEBUG+级别7,生产环境用KERN_ERR+级别3~4。

掌握了printk的日志级别机制,不管是内核调试还是驱动开发,都能精准定位问题。下次遇到内核相关的排障需求,不妨试试这些技巧,效率绝对翻倍~

如果觉得有用,记得点赞收藏并关注我们公众号,转发给身边做Linux开发的朋友!

相关推荐

登录即可解锁
  • 海量技术文章
  • 点点互娱官网入口下载
  • 产业链客户资源
  • 写文章/发需求
立即登录
Baidu
map