3

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

4

3 回答 3

3

利用

dmesg -wH &

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

dmesg -wH | grep ERR &

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

printk(KERN_EMERG "ERROR!\n");

我从我的司机那里打印

于 2018-08-10T09:57:24.797 回答
3

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)
于 2015-12-14T12:51:29.513 回答
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 的数字,较小的值代表较高的优先级。默认日志级别等于 kernel/printk/printk.cDEFAULT_MESSAGE_LOGLEVEL中指定的变量。

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

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

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

  • echo 5 > /proc/sys/kernel/printk将仅在控制台上显示日志级别从 0 到 4 的消息
  • echo 8 > /proc/sys/kernel/printk将显示在任何日志级别的控制台消息上
于 2015-12-14T13:06:39.537 回答