Linux内核调拭之printk用法

内核通过 printk() 输出相关信息,在调用 printk() 函数时必须要指定日志级别。

在 include/linux/kernel.h 中定义了如下几个日志级别

这里也可以看出数值越小,其紧急和严重程度就越高。

printk()用法

接下来,我们来看 kernel/printk.c 文件:

在 /proc/sys/kernel/printk 会显示4个数值(可由 echo 修改),分别表示
当前控制台日志级别;
未明确指定日志级别的默认消息日志级别;
最小(最高)允许设置的控制台日志级别;
引导时默认的日志级别;
当 printk()中指定的级别 (数值上)小于 当前控制台日志级别(前面说过,数值越小,严重性越高)时,printk 的信息(要有\n符)就会在控制台上显示。但无论当前控制台日志级别是何值,通过 dmesg 总能查看。

系统的日志记录工具有两种主要的:syslog 和 klog。
syslog 用于执行系统日志记录活动,系统进程显示为 syslogd。配置文件是/etc/syslog.conf。如果在配置文件中把kern.*这一行前的#号去掉,那么printk的信息也会输出到控制台。其守护进程是syslogd。syslogd 进程从一组日志源(如 /dev/log 和 /dev/klog )中读取数据,并按照 /etc/syslog.conf 中的说明处理这些日志消息。
klog 未使用过,未知。

系统日志文件保存在 /var/log/ 目录下,比较重要的四个日志文件:messages,kern.log,syslog,debug。
kern.log,syslog:一般会记录所有级别的日志
messages:得到的是比控制台日志级别低的日志
debug:得到的级别是7的日志


<think>好的,用户想了解Linux内核printk函数的使用方法。首先,我需要回忆一下printk的基本知识。printk内核中的日志打印函数,类似于用户空间的printf,但有一些不同之处。记得它支持日志级别,这个级别会影响消息的输出位置,比如控制台或日志文件。 用户可能已经知道printf的用法,所以需要对比说明printk的不同点。比如,printk的格式字符串里可以指定日志级别,像KERN_INFO这样的宏。同时,内核消息的打印还受到/proc/sys/kernel/printk中的四个数值控制,这些数值决定了当前控制台日志级别、默认消息级别等,需要详细解释这四个值的含义。 然后要考虑用户的实际使用场景。他们可能在编写内核模块时需要打印试信息或者错误信息,这时候需要知道如何printk,如何选择适当的日志级别。比如,使用KERN_ERR来输出错误信息,或者KERN_DEBUG用于试信息。同时,用户可能想知道如何查看这些打印的信息,比如通过dmesg命令或者查看/var/log/syslog文件。 另外,用户可能遇到printk信息没有在控制台显示的情况,这时候需要解释日志级别的作用,比如如果消息的级别高于控制台日志级别,才会显示在控制台。例如,默认的控制台日志级别是4,那么只有级别0-3的消息会出现在控制台,而更高级别的需要整日志级别参数或者通过dmesg查看。 还要注意printk的格式化字符串和用户空间的printf有些差异,比如不支持浮点数。需要提醒用户避免在内核代码中使用浮点格式符,否则可能导致问题。 最后,用户可能需要示例代码来更好地理解如何使用printk。给出一个简单的内核模块例子,展示不同级别的打印,并说明如何编译和测试。同时,提到查看日志的方法,比如dmesg命令,以及如何整日志级别,比如通过echo修改/proc文件系统的参数或者使用syslog系统用。 总结起来,回答的结构应该包括基本用法、日志级别说明、输出控制、使用示例和注意事项,确保用户能够全面理解printk的使用方法,并解决实际开发中的问题。同时,根据用户提供的引用资料,引用正确的来源,比如printk的代码位置和日志系统相关信息。</think>### printk函数使用方法 printkLinux内核中用于打印日志的核心函数,其用法与用户空间的printf类似,但增加了日志级别控制。以下为详细说明: #### 1. 基本语法 ```c printk(KERN_LEVEL "格式化字符串", 参数...); ``` 其中$KERN_LEVEL$为日志级别宏定义,例如: ```c printk(KERN_INFO "设备已初始化,内存地址:%p\n", ptr); ``` #### 2. 日志级别说明 系统定义了8个优先级(数值越小优先级越高): $$ \begin{array}{|l|c|} \hline \text{宏定义} & \text{数值} \\ \hline KERN_EMERG & 0 \\ KERN_ALERT & 1 \\ KERN_CRIT & 2 \\ KERN_ERR & 3 \\ KERN_WARNING & 4 \\ KERN_NOTICE & 5 \\ KERN_INFO & 6 \\ KERN_DEBUG & 7 \\ \hline \end{array} $$ 系统默认输出等级由文件$ /proc/sys/kernel/printk $控制,例如"4 4 1 7"表示: - 当前控制台日志级别:4($KERN_WARNING$及以上显示) - 默认消息级别:4(未指定级别的消息默认级别) - 最小允许级别:1 - 启动时默认级别:7[^3] #### 3. 输出位置控制 - 通过`dmesg`命令查看内核环形缓冲区内容 - 当消息级别<控制台日志级别时,信息会输出到控制台[^2] - 使用`echo 8 > /proc/sys/kernel/printk`可显示所有级别信息 #### 4. 使用示例 ```c #include <linux/module.h> static int __init test_init(void) { printk(KERN_DEBUG "试信息:模块加载\n"); printk(KERN_INFO "网络接口注册成功\n"); printk(KERN_ERR "内存分配失败!\n"); return 0; } module_init(test_init); ``` #### 5. 注意事项 - 格式化字符串不支持浮点类型(%f) - 在内核中断上下文中使用时需谨慎 - 大量打印可能影响系统性能 - 消息存储在环形缓冲区中,默认大小16KB[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值