如何在控制台中显示 printk() 消息?

问题描述 投票:0回答:3

printk()打印的信息只能在Alt+Ctrl+F1 ~ F7控制台下看到。

这些控制台无法回滚,调试起来非常不方便。我正在使用 KDE 桌面环境和控制台终端。如何将 printk() 消息重定向到控制台?

linux linux-kernel kernel printk
3个回答
4
投票

printk的语法是

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

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

#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
投票

使用

dmesg -wH &

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

dmesg -wH | grep ERR &

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

printk(KERN_EMERG "ERROR!\n");

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


1
投票

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 > /proc/sys/kernel/printk
    将仅在控制台上显示日志级别从 0 到 4 的消息
  • echo 8 > /proc/sys/kernel/printk
    将显示在任何日志级别的控制台消息上
© www.soinside.com 2019 - 2024. All rights reserved.