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

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

3天内不再提示

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

眺望电子 2025-12-19 08:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言:

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

3d8e2816-dc72-11f0-8ce9-92fbcf53809c.png


五、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开发的朋友!

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

    关注

    0

    文章

    142

    浏览量

    12749
  • LINUX内核
    +关注

    关注

    1

    文章

    321

    浏览量

    23323
  • RK3588
    +关注

    关注

    8

    文章

    601

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux内核学习笔记:printk调试

    很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信
    发表于 06-01 15:14 1981次阅读

    Linux内核调试方法的总结

    内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试
    发表于 05-20 10:30

    linux内核打印函数printk的方法

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

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

    内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如
    的头像 发表于 03-30 15:53 8228次阅读

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

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

    内核日志printk结构浅析

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

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

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

    Linux中的Printk与dmesg功能

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

    Linux:QEMU调试内核的步骤

    Linux:QEMU调试内核的步骤
    的头像 发表于 06-23 09:03 4087次阅读
    <b class='flag-5'>Linux</b>:QEMU<b class='flag-5'>调试</b><b class='flag-5'>内核</b>的步骤

    嵌入式LINUX系统内核内核模块调试

    嵌入式LINUX系统内核内核模块调试(嵌入式开发和硬件开发)-嵌入式LINUX系统内核
    发表于 07-30 13:55 10次下载
    嵌入式<b class='flag-5'>LINUX</b>系统<b class='flag-5'>内核</b>和<b class='flag-5'>内核</b>模块<b class='flag-5'>调试</b>

    内核调试利器printk的使用心得

        [导读] 刚刚开始做Linux相关开发工作时,深感Linux内核代码庞大,要加些自己的驱动进内核代码树,常常深陷bug的泥沼难以自拔,今天来分享一下
    的头像 发表于 11-08 17:31 3657次阅读
    <b class='flag-5'>内核</b><b class='flag-5'>调试</b>利器<b class='flag-5'>printk</b>的使用心得

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

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

    Linux内核中如何修改printk等级

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

    内核调试工具printkprintk的输出格式

    很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信
    的头像 发表于 09-27 16:09 2057次阅读

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

    一、开篇:一个命令引出的核心问题 在 Linux 终端执行 cat /proc/sys/kernel/printk,你可能会看到这样的输出: 这串数字不是随机的,而是内核日志系统的“核
    的头像 发表于 11-20 15:54 2086次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>printk</b><b class='flag-5'>日志</b>级别<b class='flag-5'>全</b><b class='flag-5'>解析</b>:从参数解读到实操配置