printk函数
printk函数:在linux内核中,将打印信息输出到内核信息缓冲区中,内核信息缓冲区是环形缓冲区。
"当日志级别的数值小于控制台级别时,printk要打印的信息才会在控制台打印出来,否则不会显示在控制台!"
日志级别
#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 */
日志级别对应的含义
<0>级,紧急事件,系统崩溃之前提示的消息; <1>级,必须立即采取行动; <2>级,临界状态,通常涉及严重的硬件或软件操作失败; <3>级,报告错误状态,设备驱动程序会经常使用KERN_ERR 报告来自硬件的问题; <4>级,对可能出现问题的情况进行警告; <5>级,有必要进行提示的正常情况,许多与安全相关的状况用这个级别进行提示; <6>级,内核提示性信息,很多驱动程序在启动的时候用这个级别打印出它们找到的硬件信息; <7>级,用于调试信息。
控制台级别
在kernel/printk.c里找到控制台console_printk的定义
/* printk's without a loglevel use this.. */ #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */ /* 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 */};
#define DEFAULT_MESSAGE_LOGLEVEL 4 表示默认消息日志级别,printk没定义优先级时,printk打印这个优先级以上的消息; #define MINIMUM_CONSOLE_LOGLEVEL 1 表示最小控制台日志级别,控制台日志级别可被设置的最小值; #define DEFAULT_CONSOLE_LOGLEVEL 7 表示默认的控制台日志级别,级别比这个值更高的消息日志都可以被打印;假如这个值为0,那么只有KERN_EMERG级别的日志消息才会被打印
可以使用命令 cat /proc/sys/kernel/printk来查看这四个值,例如
[xuanmiao@192 /]$ cat /proc/sys/kernel/printk 4 4 1 7
举个栗子
1 printk(KERN_DEBUG "DEBUG: Passed %s %d \n",__FUNCTION__,__LINE__);
等同于
2 printk(<7> "DEBUG: Passed %s %d \n",__FUNCTION__,__LINE__);