0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核printk日志级别全解析:从参数解读到实操配置

jf_44130326 2025-11-20 15:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、开篇:一个命令引出的核心问题

Linux终端执行cat /proc/sys/kernel/printk,你可能会看到这样的输出:

wKgZO2kc_MqAHvRAAAADO3gPLnk932.png

这串数字不是随机的,而是内核日志系统的“核心配置开关”——它直接决定了printk(内核打印函数)的日志输出行为。如果你是嵌入式开发者、内核调试工程师,或经常需要排查驱动/系统问题,理解这串数字和printk输出等级,能让你高效筛选关键日志,避免被无效信息淹没。

二、先搞懂:什么是printk输出等级?

printk是Linux内核的“调试利器”,类似用户态的printf,但多了一个核心特性——输出等级(Log Level)

它的本质是给日志贴“优先级标签”,核心作用有两个:

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

2.区分信息重要性:从致命崩溃到调试细节,8个等级帮你快速定位关键问题(比如优先关注错误级日志,忽略调试级冗余信息)。

三、8个输出等级:数值越小,越紧急!

Linux内核在中定义了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 通知(重要正常事件) 模块加载/卸载、系统启动关键步骤
KERN_INFO 6 informational 信息性消息 驱动版本、硬件探测结果
KERN_DEBUG 7 debug-level messages 调试消息 开发者调试(函数进出、变量值打印)

小细节:每个等级宏本质是带优先级的字符串,比如KERN_ERR等价于<3>,所以printk(KERN_ERR "xxx")也可以写成printk("<3>xxx")。

四、深度解读:/proc/sys/kernel/printk的4个参数

回到开篇的输出7 4 1 7,这4个参数顺序固定,分别对应内核日志的4个核心配置(从左到右):

1.控制台日志级别(console_loglevel):7

•核心作用:决定哪些日志会实时输出到控制台。

•规则:日志等级≤该值时,直接打印到控制台(数值越大,输出越全)。

•你的系统配置:7表示所有8个等级的日志(0~7)都会实时显示,适合调试场景(默认通常为4,仅输出警告及以上)。

2.默认消息日志级别(default_message_loglevel):4

•核心作用:printk未显式指定等级时,自动使用的默认等级(对应KERN_WARNING)。

•示例:printk("无等级日志")等价于printk(KERN_WARNING "无等级日志")。

3.最小控制台日志级别(minimum_console_loglevel):1

•核心作用:限制控制台日志级别的“最低值”(不能低于1)。

•意义:避免误操作将级别设为0(仅显示紧急级),导致遗漏关键日志。

4.默认控制台日志级别(default_console_loglevel):7

•核心作用:内核启动时的默认控制台级别,也作为重置参考值。

五、实操指南:日志级别配置与日志查看

1.临时修改控制台日志级别(立即生效)

•需求1:显示所有日志(调试用):

echo7 > /proc/sys/kernel/printk

•需求2:仅显示错误及以上(减少冗余):

echo3> /proc/sys/kernel/printk # 仅输出0~3级(紧急/警报/严重错误/普通错误)

•需求3:恢复默认配置(假设默认是4):

echo4417> /proc/sys/kernel/printk

2.永久修改(重启不失效)

临时修改会在重启后失效,需写入配置文件:

# 编辑 sysctl 配置文件vi/etc/sysctl.conf# 添加以下内容(根据需求调整数值)kernel.printk =4417# 生效配置sysctl-p

3.日志查看方式(3种常用)

•实时查看控制台日志:直接在终端观察(仅显示符合级别要求的日志)。

•查看内核缓冲区日志:dmesg(显示所有等级日志,包括未输出到控制台的),搭配过滤更高效:

dmesg| grep"ERR"# 筛选错误级日志dmesg -w # 实时监控日志

•查看持久化日志文件:多数发行版会将内核日志写入/var/log/kern.log,可用tail实时跟踪:

wKgZO2kc_MqANFNFAAAbUD_1glY903.png

六、开发实战:printk正确用法

1.基本语法(必须指定等级宏)

#include// 包含等级宏定义// 错误级日志:驱动初始化失败printk(KERN_ERR"网卡驱动初始化失败:设备节点不存在n");// 调试级日志:打印变量值intbuf_size =1024;printk(KERN_DEBUG"缓冲区大小:%d 字节n", buf_size);// 未指定等级(默认 KERN_WARNING)printk("参数校验警告:数值超出范围n");

2.避坑指南

•不要滥用KERN_DEBUG:调试完成后建议删除或注释,避免占用内核缓冲区。

•关键错误必须用高等级:比如驱动加载失败用KERN_ERR,而非KERN_INFO,确保不会被过滤。

•结合日志工具:复杂场景可搭配syslogd或klogd守护进程,自定义日志存储规则。

七、总结

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

•数值越小,优先级越高;

•控制台日志级别≥日志等级时,才会实时输出;

•调试用KERN_DEBUG+级别7,生产环境用KERN_ERR+级别3~4。

掌握这些知识,无论你是调试内核模块、排查驱动问题,还是优化系统日志,都能更高效地定位关键信息,告别日志“大海捞针”!

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

    关注

    88

    文章

    11871

    浏览量

    219961
  • LINUX内核
    +关注

    关注

    1

    文章

    321

    浏览量

    23345
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux内核学习笔记:printk调试

    很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信息,它与C库的printf()函数类似。
    发表于 06-01 15:14 2008次阅读

    Linux内核调试方法的总结

    的方式指定一个LOG级别printk(KERN_CRIT “Hello, world!\n”);注意,第一个参数并不一个真正的参数,因为其中没有用于分隔
    发表于 05-20 10:30

    printk()函数的总结

    我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况。对程序的调试起到了很重要的作用。(下文中的日志
    发表于 07-09 03:47

    linux内核打印函数printk的方法

    1.linux内核打印函数printk一、函数有头文件二、定义的关键宏三、函数原型合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个
    发表于 12-20 07:02

    迅为RK3399开发板Android 系统--打印级别设置(printk日志等级设置)

    内核源码 include/linux/kern_levels.h 文件中预定义了内核 log 等级,一共有八个等级, 0 到 7,优先级依次降低,如下所示: // include/
    发表于 10-25 11:21

    Linux内核模块介绍,使用Linux模块的优点

    内核通过 printk() 输出的信息具有日志级别日志级别是通过在
    的头像 发表于 03-30 15:53 8238次阅读

    如何配置和使用Linux内核printk功能

    了解如何配置和使用Linux内核printk功能,包括其动态调试功能。 这样可以选择性地打印调试消息,而无需重新编译内核
    的头像 发表于 11-27 06:40 3776次阅读

    内核日志printk结构浅析

    做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想的那样把log信息显示在我们的终端上。
    发表于 04-22 17:45 1687次阅读

    你知道Linux内核调试关键技术之一的printk

    内核调试技术之中,最简单的就是printk的使用了,它的用法和C语言应用程序中的printf使用类似,在应用程序中依靠的是stdio.h中的库,而在linux内核中没有这个库,所以在
    发表于 05-10 11:18 1968次阅读

    Linux中的Printk与dmesg功能

    要将linux内核的带级别控制的printk内容打印出来,在命令行输入 dmesg -n 8 就将所有级别的信息都打印出来。
    发表于 04-02 14:39 670次阅读

    介绍一下linux内核比较优秀的调试方式KGDB

    printf相信学过C语言的同志再熟悉不过了,然而在linux内核开发中有一种非常简洁的日志输出函数叫-printk
    的头像 发表于 03-08 13:45 2825次阅读

    Linux内核中如何修改printk等级

    KERN_SOH "7" /* 调试输出 */ Linux内核printk定义了8个输出等级, KERN_EMERG
    的头像 发表于 09-27 15:56 3702次阅读

    如何配置和验证Linux内核参数

    Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要。合理的参数调整可以显著提升网络性能、系统稳定性及资源利用率。然而,
    的头像 发表于 05-29 17:40 1519次阅读

    基于 DR1M90 的 Linux-RT 内核开发:编译配置到 GPIO / 按键应用实现(1)

    本手册由创龙科技研发,针对 DR1M90,详述 Linux-RT 实时内核开发:含实时性测试(LinuxLinux-RT 对比、CPU 空载 / 满负荷 / 隔离状态测试)、
    的头像 发表于 12-02 10:38 1448次阅读
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>内核</b>开发:<b class='flag-5'>从</b>编译<b class='flag-5'>配置</b>到 GPIO / 按键应用实现(1)

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

    日志等级机制,参数配置到实战用法一次讲透~一、printk与printf的差异用户态的printf大家都熟,直接打印内容,简单粗暴。但
    的头像 发表于 12-19 08:32 1208次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>日志</b>玩明白了吗?<b class='flag-5'>printk</b>调试神器<b class='flag-5'>全</b><b class='flag-5'>解析</b>