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

描述

前言:

做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实时跟踪:

RK3588


 

五、printk正确用法

 

 5.1  基本语法

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include    // 包含等级宏定义// 错误级日志:驱动初始化失败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开发的朋友!

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分