如何在konsole中显示printk()消息?

时间:2015-01-12 14:10:53

标签: linux linux-kernel kernel printk

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

3 个答案:

答案 0 :(得分: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.c中指定的DEFAULT_MESSAGE_LOGLEVEL变量。

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

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

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

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

答案 1 :(得分:0)

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*/

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

这些级别可用于决定应在控制台上向用户显示的内容以及不应该显示的内容。

每个控制台都将日志级别称为控制台日志级别,并且控制台上显示日志级别编号小于控制台日志级别的任何消息,以及日志级别编号高于或等于控制台的其他消息日志级别记录在内核日志(内核缓冲区)中,可以使用命令&#34; dmesg&#34;查看。

通过查看文件/ proc / sys / kernel / printk

可以找到控制台日志级别
$ cat /proc/sys/kernel/printk
4 4 1 7

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

日志级别4对应于KERN_WARNING。因此,具有日志级别3,2,1和0的所有消息将显示在屏幕上并记录,并且仅记录日志级别4,5,6,7的消息,并且可以使用&#34; dmesg&查看#34 ;.

可以通过写入proc条目

来更改控制台日志级别
$ echo "6" > /proc/sys/kernel/printk
$ cat /proc/sys/kernel/printk
6 4 1 7

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

在这里,您要打印每条消息,以便将控制台级别设置为最高编号&#34; 8&#34;

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

cat /proc/kmsg & (Android Environment)

答案 2 :(得分:0)

使用

dmesg -wH &

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

dmesg -wH | grep ERR &

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

printk(KERN_EMERG "ERROR!\n");

我从司机那里打印了