无法过滤 printk 消息

无法过滤 printk 消息

我正在编写一个驱动程序,通常我会实现自己的日志级别方案。然而,这次我想尝试利用 Linux 中内置的 printk 方案。

我发现我可以调整显示的 printk 日志级别设置

[sri@localhost ~]$ sudo cat /proc/sys/kernel/printk
4   4   1   7

我可以通过运行来设置它们

dmesg -n 3

或者

[sri@localhost ~]$ sudo bash -c 'echo 3 > /proc/sys/kernel/printk'
[sri@localhost ~]$ sudo cat /proc/sys/kernel/printk
3   4   1   7

在我的驱动程序代码中

printk(KERN_EMERG   "KERN_EMERG");
printk(KERN_ALERT   "KERN_ALERT");
printk(KERN_CRIT    "KERN_CRIT");
printk(KERN_ERR     "KERN_ERR");
printk(KERN_WARNING "KERN_WARNING");
printk(KERN_NOTICE  "KERN_NOTICE");
printk(KERN_INFO    "KERN_INFO");
printk(KERN_DEBUG   "KERN_DEBUG");

这导致

[sri@localhost scull]$ sudo dmesg | grep KERN
[ 3072.247079] KERN_EMERG
[ 3072.247084] KERN_ALERT
[ 3072.247087] KERN_CRIT
[ 3072.247089] KERN_ERR
[ 3072.247092] KERN_WARNING
[ 3072.247093] KERN_NOTICE
[ 3072.247096] KERN_INFO
[ 3072.247097] KERN_DEBUG

因此,尽管日志级别为 3(又名KERN_ERRWARNINGNOTICEINFO、 和DEBUG仍显示在日志中(dmesg/var/log/messages)。

我开始怀疑这对或/proc/sys/kernel/printk没有影响。dmesg/var/log/messages

我不明白或做错了什么?如果这是预期的行为,是否有其他内置方法来调整驱动程序的详细程度?

我正在运行 Fedora Core 20:

[sri@localhost scull]$ uname -a
Linux localhost.localdomain 3.16.6-203.fc20.x86_64 #1 SMP Sat Oct 25 12:44:32 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

答案1

/proc/sys/kernel/printk控制打印到系统控制台的内容,因此使用 dmesg 显示的打印是预期的行为。您可以使用eg 过滤dmesg 输出dmesg --level=warn(请参阅dmesg --help)。

使用动态日志记录级别,必须过滤掉 printk 消息。看来设计决策是不让内核执行此操作,而是将其留给用户空间程序。

相关内容