如何有选择地启用printk?

use*_*508 0 debugging linux-kernel

我想从内核打印一些语句,但不是全部。

那么我可以有选择地使用printk吗?

有选择地我的意思是我只想在特定的地方启用 printk 而在其他地方禁用它。

现在我只能启用(在内核配置中启用printk)或全局禁用它;我根本别无选择。

lor*_*nix 5

(编辑:附加信息也在这里:kernel.printk 值的描述

您可以使用 sysctl 命令/系统根据需要更改内核 printk 设置。

sysctl -w kernel.printk="4 4 1 7"
Run Code Online (Sandbox Code Playgroud)

会将 printk 设置设置为“默认”值,而

sysctl -w kernel.printk="3 4 1 3"
Run Code Online (Sandbox Code Playgroud)

会阻止低级消息输出到控制台。

sysctl kernel.printk
Run Code Online (Sandbox Code Playgroud)

将显示您当前的设置。

从 linux 文档(内核文档):

打印:

printk 中的四个值分别表示:console_loglevel、default_message_loglevel、minimum_console_loglevel 和 default_console_loglevel。

这些值会影响打印或记录错误消息时的 printk() 行为。有关不同日志级别的更多信息,请参阅“man 2 syslog”。

  • console_loglevel:优先级高于此的消息将打印到控制台
  • default_message_loglevel:没有明确优先级的消息将以此优先级打印
  • minimum_console_loglevel:console_loglevel 可以设置的最小(最高)值
  • default_console_loglevel:console_loglevel 的默认值

您通常需要是 root 用户,或者具有使用 sysctl 写入 (-w) 新值的 sudo 权限。您还可以将值回显到 /proc/sys/kernel/printk,为此也需要是 root(ish)。


编辑2:

我的 Monkey Debugging Assistant 提醒我,还有另一种方法可以获取有用的内核 printk 消息。

可以请求 syslog/rsyslog/whateverlog 守护进程将内核输出发送到特定文件、管道或套接字,由您选择的程序读取、解析、保存或丢弃。

我的 rsyslog.conf 显示所有kern.*级别的消息都发送到/var/log/kern.log,您可以轻松地收听该文件并获取您想要的任何消息。

也可以定义您自己的设施类型,并让 rsyslog 将它们发送到某个特殊的地方。如果需要,甚至可以选择性地将kern.warnkern.crit消息发送到某个地方。

rsyslog 和 syslog 的配置设置不同,一如既往,手册页是您的朋友。