Press "Enter" to skip to content

Linux内核调拭之printk用法

内核通过 printk() 输出相关信息,在调用 printk() 函数时必须要指定日志级别。

在 include/linux/kernel.h 中定义了如下几个日志级别

#define	KERN_EMERG	"<0>"	/* 系统崩溃 */
#define	KERN_ALERT	"<1>"	/* 必须紧急处理 */
#define	KERN_CRIT	"<2>"	/* 临界条件,严重的硬软件错误 */
#define	KERN_ERR	"<3>"	/* 报告错误 */
#define	KERN_WARNING	"<4>"	/* 警告 */
#define	KERN_NOTICE	"<5>"	/* 普通但还是须注意 */
#define	KERN_INFO	"<6>"	/* 信息 */
#define	KERN_DEBUG	"<7>"	/* 调试信息 */

这里也可以看出数值越小,其紧急和严重程度就越高。

printk()用法

printk(<2> "Hello, world!\n");          /* 直接用数字指定日志级别,用尖括号括起来 */
printk(KERN_ALERT "Hello, world!\n");   /* 也可以这么用 */

接下来,我们来看 kernel/printk.c 文件:

/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
/* 因此,如果未在 printk() 中指定日志级别,系统将默认采用4级 */

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

DECLARE_WAIT_QUEUE_HEAD(log_wait);

int console_printk[4] = {
	DEFAULT_CONSOLE_LOGLEVEL,	/* console_loglevel */
	DEFAULT_MESSAGE_LOGLEVEL,	/* default_message_loglevel */
	MINIMUM_CONSOLE_LOGLEVEL,	/* minimum_console_loglevel */
	DEFAULT_CONSOLE_LOGLEVEL,	/* default_console_loglevel */
};
/* 这4组数字可以在/proc/sys/kernel/printk中更改 */

在 /proc/sys/kernel/printk 会显示4个数值(可由 echo 修改),分别表示
当前控制台日志级别;
未明确指定日志级别的默认消息日志级别;
最小(最高)允许设置的控制台日志级别;
引导时默认的日志级别;
printk()中指定的级别 (数值上)小于 当前控制台日志级别(前面说过,数值越小,严重性越高)时,printk 的信息(要有\n符)就会在控制台上显示。但无论当前控制台日志级别是何值,通过 dmesg 总能查看。

系统的日志记录工具有两种主要的:syslog 和 klog。
syslog 用于执行系统日志记录活动,系统进程显示为 syslogd。配置文件是/etc/syslog.conf。如果在配置文件中把kern.*这一行前的#号去掉,那么printk的信息也会输出到控制台。其守护进程是syslogd。syslogd 进程从一组日志源(如 /dev/log 和 /dev/klog )中读取数据,并按照 /etc/syslog.conf 中的说明处理这些日志消息。
klog 未使用过,未知。

系统日志文件保存在 /var/log/ 目录下,比较重要的四个日志文件:messages,kern.log,syslog,debug。
kern.log,syslog:一般会记录所有级别的日志
messages:得到的是比控制台日志级别低的日志
debug:得到的级别是7的日志

参考文档:
http://blog.csdn.net/chinacodec/article/details/3913154
http://blog.chinaunix.net/uid-21961753-id-1810625.html
http://blog.chinaunix.net/uid-25100840-id-372471.html

Leave a Reply

Your email address will not be published. Required fields are marked *