简介
在内核中如何想要打印相关的信息,不能使用printf
,内核提供了一个类似的打印函数printk
。其中我认为最重要的区别就是printk
自带日志级别
。printk提供了如下几个打印级别,需要包含头文件<linux/kernel.h>
:
- KERN_EMERG
用于紧急时间消息,他们一般是系统崩溃前的提示 - KERN_ALERT
用于需要立即采取动作的情况 - KERN_CRIT
临界状态,通常涉及严重的硬件或软件操作失败 - KERN_ERR
用于报告错误状态。报告硬件问题 - KERN_WARNING
对可能出现的情况,进行预警 - KERN_NOTICE
有必要提示的正常情形 - KERN_INFO
提示性信息。 - KERN_DEBUG
调试信息
举一个例子,一个调试信息,一个临界信息:
printk(KERN_DEBUG "Here I am: %s:%i\n", __FILE__, __LINE__); /* 调试信息 */
printk(KERN_CRIT "I'm trashed; giving up on : %p:\n", ptr); /* 临界信息 */
未指定级别的printk语句采用的默认级别是DEFAULT_MESSAGE_LOGEVEL
,这个宏在kernel/printk.c
中被指定为一个整数。默认KERN_WARNING
。
printk通过串口进行输出和打印,当优先级小于console_loglevel
这个整数变量,才会输出,并且结尾必须以newline字符
结尾。
系统如果运行klogd
和syslogd
,则无论console_loglevel
值为多少,消息都追加到/var/log/messages
中(否则按照syslogd
的配置进行处理)。如果没有运行klogd,这些消息不会传递到用户空间,只能通过/proc/kmsg
文件进行查看(dmsg
命令也是看这个文件)。
console_loglevel
的初始值是DEFAULT_CONSOLE_LOGLEVEL
通过sys_syslog
系统进行调整。调用klogd
时可以指定 -c
开关选项来修改这个变量。详情参考klogd手册
。注意要修改当前值一定要先杀掉klogd,然后再用新的-c
选项来启用。
我们也可以通过对文本文件/proc/sys/kernal/printk
来访问和修改控制台日志级别。这个文件包含4个整数值,分别是:当前日志级别、未明确指定日志级别是的默认消息级别、最小允许的日志级别以及引导时的默认日志级别,像文件写入单个整数值时,将会把当前日志级别修改为这个值。
例如:
# echo 8 > /proc/sys/kernel/printk