我想从内核打印一些语句,但不是全部。
那么我可以选择性地使用 printk 吗?
我所说的选择性是指我只想在特定位置启用 printk 并在其他地方禁用它。
现在我只能全局启用(在内核配置中启用 printk)或禁用它;我根本没有选择。
答案1
(编辑:附加信息也在这里:kernel.printk 值的描述)
您可以使用 sysctl 命令/系统根据需要更改内核 printk 设置。
sysctl -w kernel.printk="4 4 1 7"
会将 printk 设置设置为“默认”值,而
sysctl -w kernel.printk="3 4 1 3"
会阻止低级别消息输出到控制台。
sysctl kernel.printk
将显示您当前的设置。
来自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 用户,或者拥有 sudo 权限才能使用 sysctl 写入 (-w) 新值。您还可以将值回显到 /proc/sys/kernel/printk 中,也需要是 root(ish)。
编辑2:
我的 Monkey 调试助手刚刚提醒我,还有另一种获取内核 printk 消息的方法,这可能很有用。
可以请求 syslog/rsyslog/whateverlog 守护进程将内核输出发送到特定文件、管道或套接字,以便由您选择的程序读取、解析、保存或丢弃(视情况而定)。
我的 rsyslog.conf 显示所有紧排。*级别消息发送至/var/log/kern.log,您可以轻松收听该文件并获取您想要的任何消息。
也可以定义自己的设施输入并让 rsyslog 将它们发送到特殊的地方。甚至选择性发送内核警告或者内核临界值如果需要的话,可以向某个地方发送消息。
rsyslog 和 syslog 的配置设置不同,一如既往,手册页是您的朋友。