内核中没有 C 库,所以不能使用 printf 打印。但它提供了类似的 printk 函数,printk 函数输出的字符串前加一个带尖括号的整数来控制打印级别,如 printk("<6>Hello, world!\n") 。级别数值越小,优先级越高,其紧急和严重程度就越高。然而,需要注意的是,并不是所有级别的消息都会进行输出,而是根据 printk 的打印级别进行过滤。
printk 打印级别宏定义:
#define KERN_EMERG KERN_SOH "0" /* system is unusable */
#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
#define KERN_CRIT KERN_SOH "2" /* critical conditions */
#define KERN_ERR KERN_SOH "3" /* error conditions */
#define KERN_WARNING KERN_SOH "4" /* warning conditions */
#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */
#define KERN_INFO KERN_SOH "6" /* informational */
#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
#define KERN_DEFAULT KERN_SOH "d" /* the default kernel loglevel */
内核日志打印级别查看:
cat /proc/sys/kernel/printk
4 4 1 7
该文件包含四个数字值,分别表示:
- 控制台日志级别(Console log level):只有级别高于设定值的日志消息才会被显示在控制台上(值要小于该值)。
- 默认的消息日志级别(Default message log level):用于打印没有优先级的消息,即当 printk 没有指定消息级别时,将使用该默认级别。
- 最低的控制台日志级别(Minimum console log level):控制台日志级别可被设置的最小值,也就是最高的优先级。
- 默认的控制台日志级别(Default console log level):控制台日志级别的缺省值。
修改内核日志打印级别:
echo "6 4 1 7" | sudo tee /proc/sys/kernel/printk
修改后的值重启后会恢复,如果要保持,可以将它添加到启动脚本中,以便在系统启动时重新设置。
printk 打印的是控制台,也就是 /dev/console。而图形界面中的终端,其实是把 stdin,stdout,stderr 三个文件重定向了一下。所以 printk 是不能在图形界面中的终端中显示的,当然可以在 /var/log/syslog 或者用 dmesg 查看。
不够打印级别的信息会被写到日志中可通过 dmesg 命令来查看。
dmesg 命令:
实时监控 dmesg 的日志输出:
watch "dmesg | tail -20"
|