Android7.1+msm8937系统/proc/sys/kernel/printk参数介绍及日志打印设置

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优先级高于第17,所以会输出到控制台。

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数据不打印问题

https://www.cnblogs.com/wmx-learn/p/5344821.html

猜你喜欢

转载自blog.csdn.net/loongembedded/article/details/80536165