use*_*508 0 debugging linux-kernel
我想从内核打印一些语句,但不是全部。
那么我可以有选择地使用printk吗?
有选择地我的意思是我只想在特定的地方启用 printk 而在其他地方禁用它。
现在我只能启用(在内核配置中启用printk)或全局禁用它;我根本别无选择。
(编辑:附加信息也在这里: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.warn或kern.crit消息发送到某个地方。
rsyslog 和 syslog 的配置设置不同,一如既往,手册页是您的朋友。