终端下更改printk打印级别

如何去更改printk的打印级别?

1、查看当前控制台的打印级别

# cat /proc/sys/kernel/printk

 

该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处,上面显示的4个数据分别对应如下:

控制台日志级别:优先级高于该值得消息将被打印到到控制台;

默认的消息日志级别:将用该优先级来打印没有优先级的消息;

最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级);

默认的控制台日志级别:控制台日志级别的缺省值。

以上的数值设置,数值越小,优先级越高。

上面这个4个值的定义在kernel/printk.c,如下:

 

内核通过printk()输出的信息具有日志级别,日志级别是通过在printk()输出的字符串前带一个尖括号的整数来控制的,例如:printk(“<6>Hello World!\n”);。内核中提供了8种不同的日志级别,在linux/kernel_levels.h中有相应的宏定义,如下:

 

因此,printk()可以这样来使用:

printk(KERN_INFO”Hello World\n”);

当未指定日志级别的printk()采用默认的级别是DEFAULT_MESSAGE_LOGLEVEL,这个宏定义为整数4。

如果想要在内核启动过程中打印少的信息,可以根据自己的需要在kernel/printk.c中修改以上的数值,重新编译后,烧写内核镜像。

2、修改printk的打印级别

在系统的终端处修改打印级别,例如,屏蔽所有的内核printk打印,那么只需要将第一个数值调到最小值1或0即可

# echo 1       4       1      7 > /proc/sys/kernel/printk
or
# echo 0       4       0      7 > /proc/sys/kernel/printk

转载于:https://www.cnblogs.com/Cqlismy/p/11358446.html

<think>好的,我现在需要帮助用户了解printk的使用说明。首先,我得回忆一下自己关于Linux内核中printk的知识,确保信息准确。printk是内核中的日志记录函数,类似于用户空间的printf,但有一些特殊之处。 首先,用户可能想知道printk的基本用法,比如语法和参数。我需要解释它的函数原型,例如int printk(const char *fmt, ...);,并说明它支持类似的格式字符串,比如%d、%s等。同时,要提到优先级参数,比如KERN_EMERG、KERN_ALERT这些级别,以及如何在实际使用中添加,比如printk(KERN_INFO "Message\n");。 然后,可能需要说明printk和printf的不同之处,比如printk没有浮点支持,而且消息输出到内核日志缓冲区,用户需要通过dmesg或者/proc/kmsg查看。此外,优先级的作用也很重要,影响日志在控制台的显示和系统处理方式,比如是否立即刷新到终端。 还要提到printk的格式化扩展,比如%pS用于符号解析,%pf用于函数指针,这对调试有帮助。另外,注意内核环境下字符串长度限制,避免过长的消息被截断,导致信息不全。 用户可能关心如何控制日志级别,比如通过/proc/sys/kernel/printk设置当前控制台日志级别,或者使用echo 8 > /proc/sys/kernel/printk来调整。这里需要说明各个数值对应的级别,以及如何影响日志输出。 另外,printk的同步和异步问题,比如在高频调用时可能影响实时性,或者导致日志丢失的情况。这部分可能需要建议用户合理使用日志级别,避免过度使用影响性能。 还要考虑到现代内核中的动态调试功能,比如pr_debug()和动态调试的控制,可能比printk更灵活,适合调试时使用。这里可以对比一下,让用户了解不同场景下的选择。 最后,总结一下使用printk的注意事项,比如优先级的选择、格式化字符串的限制、日志查看方法,以及性能影响。确保用户能够全面理解如何正确有效地使用printk进行内核开发或调试。 检查是否有遗漏点,比如日志缓冲区的环状结构,当缓冲区满时旧日志会被覆盖,这点在长时间运行或高频日志记录时需要注意。此外,可能提到printk的延迟问题,在内核某些上下文中(如中断处理)使用时的限制,以及可能的替代方案。 确保语言通俗易懂,结构清晰,分点说明,方便用户理解。同时,使用中文,避免术语混淆,必要时举例说明。比如,给出几个printk调用的例子,展示不同优先级的使用方法,以及对应的dmesg输出效果。 现在整理这些点,组织成一个结构化的回答,确保覆盖基本用法、参数说明、日志级别控制、使用注意事项、示例和查看方法等方面,帮助用户全面掌握printk的使用。</think>printk 是 Linux 内核中用于记录日志的核心函数,功能类似用户空间的 `printf`,但具有内核态特性。以下是详细使用说明: --- ### 一、基础语法 ```c int printk(const char *fmt, ...); ``` - **格式化字符串**:支持 `%d`, `%s`, `%p` 等占位符(**不支持浮点**)。 - **日志优先级**:通过宏定义指定消息级别,格式为 `<优先级>消息`: ```c printk(KERN_INFO "Network interface up\n"); // KERN_INFO 是优先级宏 ``` --- ### 二、日志级别 | 宏定义 | 数值 | 说明 | |-----------------|------|--------------------------| | KERN_EMERG | 0 | 系统不可用 | | KERN_ALERT | 1 | 需立即处理 | | KERN_CRIT | 2 | 严重错误 | | KERN_ERR | 3 | 错误条件 | | KERN_WARNING | 4 | 警告条件 | | KERN_NOTICE | 5 | 普通但需注意的事件 | | KERN_INFO | 6 | 信息性消息 | | KERN_DEBUG | 7 | 调试级消息 | --- ### 三、关键特性 1. **输出目标**: - 写入内核环形缓冲区(可通过 `dmesg` 查看)。 - 根据优先级决定是否输出到控制台(如 `KERN_EMERG` 会直接显示)。 2. **格式化扩展**: - `%pS`:解析地址为符号(如函数名)。 - `%pf`:打印函数指针名称。 ```c printk(KERN_DEBUG "Caller: %pS\n", __builtin_return_address(0)); ``` 3. **长度限制**: - 单条消息建议不超过 **1024 字节**,超长内容会被截断。 --- ### 四、优先级控制 1. **查看当前级别**: ```bash cat /proc/sys/kernel/printk # 输出:7 4 1 7 → 依次为当前控制台日志级别、默认消息级别、最低允许级别、启动时默认级别 ``` 2. **修改控制台日志级别**: ```bash echo 6 > /proc/sys/kernel/printk # 仅显示 KERN_INFO 及以上级别 ``` --- ### 五、使用示例 ```c // 记录错误信息 printk(KERN_ERR "PCIe device %s initialization failed\n", dev_name); // 调试模块加载 printk(KERN_DEBUG "Driver %s loaded, version: %s\n", DRIVER_NAME, DRIVER_VERSION); ``` --- ### 六、查看日志 1. **实时监控**: ```bash dmesg -wH # -w: 持续监视, -H: 友好时间格式 ``` 2. **按优先级过滤**: ```bash dmesg -l err,crit # 仅显示错误和严重消息 ``` --- ### 七、注意事项 1. **性能影响**:高频调用可能影响实时性,建议生产环境减少 `KERN_DEBUG` 使用。 2. **上下文限制**:在中断上下文使用时,避免阻塞操作(如长格式字符串)。 3. **替代方案**:调试时优先使用动态调试(`pr_debug()` + `DYNAMIC_DEBUG` 宏控制)。 --- 通过合理选择日志级别和控制策略,`printk` 能有效辅助内核开发和问题排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值