今天被打印信息的去除困扰了,想了想,如果靠一个一个的改动未免太繁琐。因此就仔细的看了下这部分的打印原理。当然下面只是简单的进行了知识罗列不过有需要的朋友可以随便看看。说不准会有些收获呢。
Include/linux/printk.h中有如下定义:
#defineKERN_EMERG
"<0>"
/* system is unusable
*/
#defineKERN_ALERT
"<1>"
/* action must be taken immediately
*/
#defineKERN_CRIT
"<2>"
/* critical conditions
*/
#defineKERN_ERR
"<3>"
/* error conditions
*/
#defineKERN_WARNING
"<4>"
/* warning conditions
*/
#defineKERN_NOTICE
"<5>"
/* normal but significant condition
*/
#defineKERN_INFO
"<6>"
/* informational
*/
#defineKERN_DEBUG
"<7>"
/* debug-level messages
*/
/*Use the default kernel loglevel */
#defineKERN_DEFAULT
"<d>"
/*
*Annotation for a "continued" line of log printout (only done after a
*line that had no enclosing \n). Only to be used by core/arch code
*during early bootup (a continued line is not SMP-safe otherwise).
*/
#defineKERN_CONT
"<c>"
externint console_printk[];
#defineconsole_loglevel (console_printk[0])
#definedefault_message_loglevel (console_printk[1])
#defineminimum_console_loglevel (console_printk[2])
#definedefault_console_loglevel (console_printk[3])
这样定义了通常使用的prink函数调用时的参数。通过上面的定义可以清晰的看到系统默认的loglevel,包括日志级别和控制台级别。
/*printk's without a loglevel use this.. */
#defineDEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL
/*We show everything that is MORE important than this.. */
#defineMINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#defineDEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
DECLARE_WAIT_QUEUE_HEAD(log_wait);
intconsole_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 */
};
通过上面的了解,可以知道当linux内核启动之后,能够看到那些级别的log信息。当然很多情况下,添加打印信息都是为了方便调试,当系统启动之后,很有可能我们变得很讨厌添加的log信息,或者想看到某个级别的信息。此时如果重新编译kernel然后烧写就会很浪费时间。这种情况下,应该最好能及时的修改日志级别看到真正想要看到的log 信息。
既然有这样的需求,那么linux能否提供呢?
答案当然不出意料,在linux中的特殊的文件proc中,就有这样可以进行操作的文件。
使用如下命令查看现在的printk的情况:
#cat /proc/sys/kernel/printk
7 4 1 7
对照上面的信息,就知道现在console中的级别为7,为了屏蔽部分信息,可以通过如下命令
#echo 4 > /proc/sys/kernel/printk
LOGE\LOGD\LOGI等宏定义一般都是某个公司自己内部定义使用的打印函数,一般定义在board端的一个log-private.h文件中 ,被log.h文件引用之后,被hardware.h文件引用。在驱动中的头文件如果包含了这个头文件,那么程序中就可以使用LOGI的打印宏定义。