printk loglevel在模块编程中的用法

Jit*_*esh 4 linux linux-device-driver linux-kernel printk

Rubini的LDD3一书中,printk作者说,我们可以为我们的消息提供日志级别/优先级.但我尝试使用一个简单的模块程序,它具有不同的日志级别的printks,但它显示了我在程序中写入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 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)

我得到如下输出

[ 1508.721441] inside init 4 
[ 1508.721448] inside init 3
[ 1508.721454] inside init 2
root@jitesh-desktop:~/DD/debug/print#
Run Code Online (Sandbox Code Playgroud)

所以我如何按照优先级打印它

init 2
init 3
init 4
Run Code Online (Sandbox Code Playgroud)

Pav*_*ath 11

你混淆了printk优先事项的目的.它们并不意味着改变你在这里所希望的执行顺序.

通过为不同的内核消息分配不同的优先级,我们可以loglevel通过内核命令行指定适当的值来过滤掉控制台上出现的所需消息.例如,在linux内核中.有许多KERN_DEBUG优先消息.这些只是普通的调试消息.因此,如果您启用loglevel最多7,那么您将在控制台上看到大量消息!并且您的重要错误和警告将被埋没在这一系列正常的调试消息中.

因此,在调试严重问题时,可以将其指定loglevel为较低的值,以便控制台上仅显示严重错误和警告.

注意:loglevel无论如何,所有printk消息都存储在内核缓冲区中.优先级决定哪一个进入控制台.

  • 另外:您可以通过将日志级别写入`/ proc/sys/kernel/printk`来动态更改日志级别,例如`echo 3>/proc/sys/kernel/printk`.`cat`ing此文件将按以下顺序显示:当前级别,没有警告的消息的默认级别,最低级别和启动时间默认级别. (2认同)