printk() 打印的信息只能在 Alt+Ctrl+F1 ~ F7 控制台下看到。
这些控制台非常不方便调试,因为它们无法回滚。我正在使用 KDE 桌面环境和控制台终端。如何将 printk() 消息重定向到控制台?
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)
使用
dmesg -wH &
强制所有打印到 dmesg 的内核消息(以及虚拟终端,如 Ctrl + Alt + F1,具体取决于您的/proc/sys/kernel/printk 日志级别和消息级别),也出现在您的 SSH 或 GUI 控制台上:Konsole、终端或您正在使用的任何内容!而且,如果您只需要监视特定消息:
dmesg -wH | grep ERR &
我正在使用它来监视"错误"消息,例如
printk(KERN_EMERG "ERROR!n");
我从我的驱动程序打印的。
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 中指定的变量。
如何从用户级别读取消息取决于某些用户级守护进程(例如,klogd 和 syslogd)的配置以及默认日志级别。为了回答您的问题,根据您的特定配置,以下一个或多个命令将允许您读取 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
将显示在控制台上显示任何日志级别的消息