【问题标题】:How can I show printk() message in console?如何在控制台中显示 printk() 消息?
【发布时间】:2015-01-12 14:10:52
【问题描述】:

printk()打印出来的信息只能在Alt+Ctrl+F1~F7下看到kbd> 控制台。 这些控制台无法回滚,因此非常不方便调试。我正在使用 KDE 桌面环境和控制台终端,如何将 printk() 消息重定向到控制台?

【问题讨论】:

  • shift+pgup 键应该向上滚动。
  • 使用这个命令dmesg -n8。这会将所有 printk 消息重定向到活动的控制台终端。
  • @indiv 切换控制台后回滚缓冲区清空。
  • 根据系统的不同,有多种方法可以在终端模拟器程序中获取内核日志。 dmesg, tail -f /var/log/..

标签: linux linux-kernel kernel printk


【解决方案1】:

使用

dmesg -wH &

强制打印到 dmesg 的所有内核消息(以及 Ctrl+Alt+F1 等虚拟终端,具体取决于您的 /proc/sys/kernel/printk 日志级别和消息级别),也会出现在您的 SSH 或 GUI 控制台上:Konsole、终端或您正在使用的任何东西!而且,如果您只需要监控特定消息:

dmesg -wH | grep ERR &

我正在使用它来监视“错误”消息,例如

printk(KERN_EMERG "ERROR!\n");

我从我的驱动程序中打印出来的

【讨论】:

    【解决方案2】:

    printk的语法是

    printk ("log level" "message", <arguments>);
    

    内核在文件 printk.h 中定义了 8 个日志级别

    #define KERN_EMERG "<0>" /* system is unusable*/
    #define KERN_ALERT "<1>" /* action must be taken immediately*/
    #define KERN_CRIT "<2>" /* critical conditions*/
    #define KERN_ERR "<3>" /* error conditions*/
    #define KERN_WARNING "<4>" /* warning conditions*/
    #define KERN_NOTICE "<5>" /* normal but significant condition*/
    #define KERN_INFO "<6>" /* informational*/
    #define KERN_DEBUG "<7>" /* debug-level messages*/
    

    每个日志级别对应一个数字,数字越小消息的重要性越高。

    级别有助于决定在控制台上应该向用户显示什么以及不应该显示什么。

    每个控制台都有一个称为控制台日志级别的日志级别,任何日志级别编号小于控制台日志级别的消息都会显示在控制台上,其他日志级别编号高于或等于控制台日志的消息级别记录在内核日志(内核缓冲区)中,可以使用命令“dmesg”查看。

    可以通过查看文件 /proc/sys/kernel/printk 找到控制台日志级别

    $ cat /proc/sys/kernel/printk
    4 4 1 7
    

    输出中的第一个数字是控制台日志级别,第二个是默认日志级别,第三个是最小日志级别,第四个是最大日志级别。

    日志级别 4 对应于 KERN_WARNING。因此,所有日志级别为 3、2、1 和 0 的消息都将显示在屏幕上并被记录下来,而日志级别为 4、5、6、7 的消息只会被记录下来,并且可以使用“dmesg”查看。

    控制台日志级别可以通过写入proc条目来改变

    $ echo "6" > /proc/sys/kernel/printk
    $ cat /proc/sys/kernel/printk
    6 4 1 7
    

    现在控制台日志级别设置为 6,即 KERN_INFO。

    在这里您要打印出每条消息,因此您应该将控制台级别设置为最高数字“8”

    echo "8" > /proc/sys/kernel/printk 
    tail -f /var/log/kern.log & 
    

    cat /proc/kmsg & (Android Environment)
    

    【讨论】:

      【解决方案3】:

      printk()是Linux内核提供的打印调试/信息/错误信息的功能。在内部,内核维护一个__LOG_BUF_LEN 字节长的循环缓冲区(根据配置,它的范围可以从 4KB 到 1MB)。

      有 8 种可能的日志级别与消息相关联并在 linux/kernel.h 中定义:

      • KERN_EMERG:紧急(系统无法使用)
      • KERN_ALERT: 严重问题(即必须立即采取行动)
      • KERN_CRIT:危急情况,通常与硬件或软件故障有关
      • KERN_ERR:用于错误情况,通常与硬件问题有关
      • KERN_WARNING:用于警告不严重的问题情况
      • KERN_NOTICE:需要通知的正常情况
      • KERN_INFO:信息性消息;许多驱动程序会打印有关找到的硬件的信息
      • KERN_DEBUG:仅用于调试

      每个字符串代表一个从 0 到 7 的数字,较小的值代表较高的优先级。默认日志级别等于 DEFAULT_MESSAGE_LOGLEVEL 变量在kernel/printk/printk.c 中指定。

      如何从用户级读取消息取决于某些用户级守护进程(例如klogdsyslogd)的配置以及默认日志级别。要回答您的问题,根据您的具体配置,以下一个或多个命令将允许您读取 printk 的输出:

      • dmesg 控制台命令(通常是一次性手动检查的首选方式)
      • tail -f /var/log/kern.log 命令
      • 通过/proc/kmsg(不鼓励)

      根据您的配置,您可能还想更改控制台中显示的默认日志级别。从 klogd 2.1.31 开始,可以通过回显到 /proc/sys/kernel/printk 来更改默认日志级别。例子:

      • echo 5 &gt; /proc/sys/kernel/printk 将仅在控制台上显示日志级别从 0 到 4 的消息
      • echo 8 &gt; /proc/sys/kernel/printk 将显示在任何日志级别的控制台消息上

      【讨论】:

        最近更新 更多