Android7.1+msm8937系统/proc/sys/kernel/printk参数介绍及日志打印设置
1. 相关概念
Console,控制台,通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。我们这里是指串口。
显示系统消息的终端就叫控制台,Linux 默认所有虚拟终端都是控制台,都能显示系统消息。
/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上.
2. /proc/sys/kernel/printk参数的含义
cat /proc/sys/kernel/printk
7 4 1 7
这是当前控制台的打印级别,数值越小,优先级越高,这4个值对应的含义kernel\msm-3.18\kernel\printk\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 */
};
打印等级 |
含义 |
CONSOLE_LOGLEVEL_DEFAULT |
控制台日志级别,如7,优先级高于该值的消息将在控制台显示,那么就是0-6级别的消息才会被输出到控制台。 |
MESSAGE_LOGLEVEL_DEFAULT |
默认的printk消息日志级别,如4,printk没指定日志级别时,默认级别是DEFAULT_MESSAGE_LOGLEVEL(一般为4),由于4优先级高于第1个7,所以会输出到控制台。 |
CONSOLE_LOGLEVEL_MIN |
最低控制台日志级别,如1 控制台日志级别可被设置的最小值(最高优先级) |
CONSOLE_LOGLEVEL_DEFAULT |
默认的控制台日志级别,如7,即第1个参数的默认级别 |
如果kernel的打印等级/proc/sys/kernel/printk是默认值7 4 1 7, (四个值的含义:控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别)
内核通过printk() 输出的信息具有日志级别,日志级别是通过在printk() 输出的字符串前加一个带尖括号的整数来控制的,如printk("<6>Hello,world!\n");。内核中共提供了八种不同的日志级别,在 linux/kernel.h 中有相应的宏对应。
Y:\MU980\Code\LA.UM.5.6\LINUX\android\kernel\msm-3.18\include\linux\kern_levels.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 */
printk没有指定日志级别的printk语句默认采用的级别是MESSAGE_LOGLEVEL_DEFAULT(这个默认级别一般为<4>,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到
linux/printk.h:37:#defineMESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT
3. 编译系统/proc/sys/kernel/printk的值的确定
(1) device\qcom\common\rootdir\etc\init.qcom.rc-----------193:1
# Set the console loglevel to <KERN_INFO,这里是指第1个6
#Set the default message loglevel to KERN_INFO,这里指第2个6
write/proc/sys/kernel/printk "6 6 1 7"
…
service qcom-sh /system/bin/sh/init.qcom.sh
class late_start
user root
oneshot
service qcom-post-boot /system/bin/sh/system/etc/init.qcom.post_boot.sh
class late_start
user root
disabled
oneshot
(2) device\qcom\common\rootdir\etc\init.qcom.sh---2
#check build variant for printk logging
#current default minimum boot-time-default
buildvariant=`getprop ro.build.type`
case "$buildvariant" in
"userdebug" | "eng")
#set default loglevel to KERN_INFO
echo "6 6 1 7" > /proc/sys/kernel/printk
;;
*)
#set default loglevel to KERN_WARNING
echo "4 4 1 4" > /proc/sys/kernel/printk
;;
Esac
根据是user、userdebug和eng版本设置不同的默认loglevel。
(3) device\qcom\common\rootdir\etc\init.qcom.post_boot.sh----3
# Change console log level as per consoleconfig property
console_config=`getprop persist.console.silent.config`
case "$console_config" in
"1")
echo "Enable console config to $console_config"
echo 0 > /proc/sys/kernel/printk
;;
*)
echo "Enable console config to $console_config"
;;
Esac
persist.console.silent.config的值是1,
可以通过修改这些文件的赋值来决定系统默认的值。
4. 设置控制级别的方法
可用下面的命令设置当前日志级别:
echo 8 > /proc/sys/kernel/printk
这样所有级别<8,(0-7)的消息都可以显示在控制台上.
其实printk始终是能输出信息的,只不过不一定是到了终端上。我们可以通过dmesg或是kmsg获取。
参考链接:
/proc/sys/kernel/printk 打印log设置
https://blog.csdn.net/u012385733/article/details/76088274
修改kernel的打印等级的几种方法
https://blog.csdn.net/ysh149216447/article/details/53435864
linux内核打印数据到串口控制台,printk数据不打印问题