【转载】修改printk打印等级

调试内核模块时候,若调试信息太多可以通过修改/proc/sys/kernel/printk文件内容来控制。

cat /proc/sys/kernel/printk
7       4       1      7     # 默认值为7417,值越小,优先级越高 

上面显示的4个数据分别对应:

  • 控制台日志级别: 优先级高于该值的消息将被打印至控制台
  • 默认的消息日志级别: 将用该优先级来打印没有优先级的消息
  • 最低的控制台日志级别: 控制台日志级别可被设置的最小值(最高优先级)
  • 默认的控制台日志级别: 控制台日志级别的缺省值

其实这四个值是在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 */
};

内核通过printk() 输出的信息具有日志级别,日志级别是通过在printk()输出的字符串前加一个带尖括号的整数来控制的,如printk("<6>Hello, world!\n");

内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。

#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	""		/* the default kernel loglevel */

所以printk() 可以这样用:printk(KERN_INFO"Hello, world!\n");

未指定日志级别的printk() 采用的默认级别是DEFAULT_MESSAGE_LOGLEVEL,这个宏在kernel/printk.c 中被定义为整数4,即对应KERN_WARNING

#define default_message_loglevel (console_printk[1])

如果要想在内核启动过程中打印少的信息,就可以根据自己的需要在kernel/printk.c中修改以上数值,重新编译即可!

/* printk's without a loglevel use this.. */
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT  #默认为0

例如: 屏蔽掉所有的内核printk打印,那么我只需要把第一个数值调到最小值1或者0。

echo 1 4 1 7 > /proc/sys/kernel/printk

路虽远行则将至、事虽难做则必成
MrWang

你可能感兴趣的:(Linux,printk,Linux)