在 Rubini 的 LDD3 一书中,在printk
部分下,作者说我们可以为我们的消息提供日志级别/优先级。但是我尝试使用一个简单的模块程序,该程序具有不同的 printk 日志级别,但它显示的顺序与我在程序中编写 printk 消息的顺序相同,为什么它不根据优先级打印?
我在这里复制了代码
#include<linux/module.h>
#include<linux/kernel.h>
static __init int log_init(void)
{
printk(KERN_INFO"inside init 4 n");
printk(KERN_ERR"inside init 3n");
printk(KERN_CRIT"inside init 2n");
return 0;
}
static __exit void log_exit(void)
{
printk("inside exitn");
}
module_init(log_init);
module_exit(log_exit);
MODULE_LICENSE("GPL");
我得到了如下输出
[ 1508.721441] inside init 4
[ 1508.721448] inside init 3
[ 1508.721454] inside init 2
root@jitesh-desktop:~/DD/debug/print#
那么我如何根据优先级打印它,例如
init 2
init 3
init 4
你混淆了printk
优先级的目的。它们并不意味着像您在此处希望的那样更改执行顺序。
分配不同的优先级,我们可以通过在内核命令行指定适当的 loglevel
值来过滤掉控制台上出现的所需消息。例如,在 linux 内核中。有许多消息具有KERN_DEBUG
优先级。这些只是普通的调试消息。因此,如果您将loglevel
启用到最大 7,那么您将在控制台上看到大量消息!!您的重要错误和警告将被埋没在这一系列正常的调试消息中。
因此,在调试严重问题时,可以将loglevel
指定为较低的值,以便在控制台上仅显示严重错误和警告。
注意:无论loglevel
如何,所有printk
消息都存储在内核缓冲区中。优先级决定了其中哪一个进入控制台。