我正在编写一个驱动程序,通常我会实现自己的日志级别方案。然而,这次我想尝试利用 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_ERR
)WARNING
,NOTICE
、INFO
、 和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 消息。看来设计决策是不让内核执行此操作,而是将其留给用户空间程序。