快速答案
sudo dmesg -n 8
或者
将printk
设为始终打印到终端(把控制台log
等级设为最高的8
)。
(注:可能需要root
权限)
echo "8" > /proc/sys/kernel/printk
tail -f /var/log/kern.log &
背景知识:printk 和 log level
printk的语法如下
printk ("log level" "message", <arguments>);
其中,log level
指的是这句printk
所打印消息的重要性级别
。是用来决定哪些信息被打印到终端,展示给用户,哪些留在系统的日志文件(即/var/log/syslog
文件)。
Linux内核
总共定义了八种重要性级别
,具体可以在printk.h
文件里找到(也有说法是在linux/kernel.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*/ // 只在debug时使用
每种重要性级别
都对应一个数字。数字越小,重要性越高。
查看日志里的消息
方法一
实时查看日志文件内容。
tail -f /var/log/syslog
方法二
将日志内容打印到终端。
dmesg
改变控制台log等级
控制台也有一个这样的log
等级,称为console log level
。重要级高于这个等级的消息会被打印在控制台上。其他的只会被记入kernel log
(又称为kernel buffer
)。可以通过dmesg
命令查看。
控制台的log
等级可以在/proc/sys/kernel/printk
里查看
cat /proc/sys/kernel/printk
如:
$ cat /proc/sys/kernel/printk
4 4 1 7
输出结果中的四个数字分别代表控制台log等级
,默认log等级
,最小log等级
,和最大log等级
。
由于log
等级4
代表KERN_WARNING
,所以等级0~3
的消息会被输出到控制台,4~7
的消息只会记录在内核日志里,可以通过dmesg
命令查看。
可以通过下面的方式改变控制台log
等级。
(注:可能需要root
权限)
sudo echo "6" > /proc/sys/kernel/printk
现在再查看,发现控制台的log level
被改为了6
(KERN_INFO
)。
$ cat /proc/sys/kernel/printk
6 4 1 7
参考链接
How can I show printk() message in console? - StackOverflow
How to display linux printk() messages in virtual console (tty1) - StackOverflow