内核中预定义的内核log等级
// include/linux/kern_levels.h
#define KERN_SOH "\001" /* ASCII Start Of Header */
#define KERN_SOH_ASCII '\001'
#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 */
为什么是\001呢,那什么又是SOH字符呢?
0~127的每个数字,都可以看做一个字符。’\001’是8进制的1,转换成十进制,也是1。
控制字符(Control Character),出现于特定的信息文本中,表示某一控制功能的字符。
在ASCII码中,第0~31号及第127号(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。
printk打印消息控制
// linux/include/printk.h
/* printk's without a loglevel use this.. */
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT
/* We show everything that is MORE important than this.. */
#define CONSOLE_LOGLEVEL_DEFAULT 7
#define CONSOLE_LOGLEVEL_MIN 1
#define CONSOLE_LOGLEVEL_DEFAULT 7
-------------------------------------------------------------------------
// kernel/printk.c
int console_printk[4] = {
CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */
MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel */
CONSOLE_LOGLEVEL_MIN, /* minimum_console_loglevel */
CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel */
};
-------------------------------------------------------------------------
// linux/include/printk.h
extern int console_printk[];
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
console_loglevel
只有当printk打印消息的log优先级高于console_loglevel时,才能输出到终端上
default_message_loglevel
printk打印消息时默认的log等级
minimum_console_loglevel
console_loglevel可以被设置的最小值
default_console_loglevel
console_loglevel的缺省值
1. 查看当前printk打印消息的log等级
# cat /proc/sys/kernel/printk
# 7 4 1 7
“7 4 1 7” 分别对应console_loglevel、default_message_loglevel、minimum_c onsole_loglevel、default_console_loglevel,意味着只有优先级高于KERN_DEBUG(7)的打印消息才能输出到终端
2. 改变console_loglevel
# echo 8 4 1 7 > /proc/sys/kernel/printk
输入“8 4 1 7”改变console_loglevel值,使得所有的打印消息都能输出到终端;
如果想屏蔽掉所有的内核printk打印,那么只需要把第一个数值调到最小值1或者0。
# echo 1 4 1 7 > /proc/sys/kernel/printk
或者
# echo 0 4 0 7 > /proc/sys/kernel/printk
printk打印举例
为了确认内核打印等级以及prink 参数对打印的分级,在驱动中加入如下代码。
每次insmod 、rmmod led模块时,根据打印等级的设置,得到不同的打印结果:
printk(KERN_EMERG " 1111111 KERN_EMERG\n");
printk(KERN_ALERT " 2222 KERN_ALERT\n");
printk(KERN_CRIT " 3333333 KERN_CRIT\n");
printk(KERN_ERR " 44444444 KERN_ERR\n");
printk(KERN_WARNING " 55555 KERN_WARNING\n");
printk(KERN_NOTICE " 66666 KERN_NOTICE\n");
printk(KERN_INFO " 77777 KERN_INFO\n");
printk(KERN_DEBUG " 888888 KERN_DEBUG\n");
printk(" 9999 no_fix\n");
操作:
一次性地设置编译内核源码时默认的打印级数:【它们在kernel/printk.c中定义】
echo 8 4 1 7 > /proc/sys/kernel/printk
insmod 模块后,打印信息如下:
1111111 KERN_EMERG
2222 KERN_ALERT
3333333 KERN_CRIT
44444444 KERN_ERR
55555 KERN_WARNING
66666 KERN_NOTICE
77777 KERN_INFO
888888 KERN_DEBUG
9999 no_fix