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

本文介绍了Android系统中/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

 

<think>好的,用户问的是关于`echo 8 > /proc/sys/kernel/printk`和内核打印等级的问题。首先,我需要确认用户对Linux内核日志级别是否了解,以及他们为什么需要调整这个设置。可能的情况是用户在调试内核模块或者驱动程序,遇到了日志信息过多或过少的问题,想要调整日志输出的详细程度。 接下来,我应该解释`/proc/sys/kernel/printk`的作用。这个文件控制内核日志的显示等级。默认情况下,可能设置为一个较低的级别,比如4,这样只有错误和警告级别的消息才会显示。用户输入8,可能是想开启更详细的日志输出,比如调试信息。 需要详细说明各个日志等级对应的数值,比如0是紧急,7是调试。然后解释为什么设置为8,虽然理论上7是最高级别,但某些系统可能允许更高的数值,或者用户可能有特定的配置需求。不过通常7已经是最高的调试级别,所以需要指出这一点,避免混淆。 然后,用户可能想知道修改这个值的影响,比如系统性能是否会受影响,或者是否会导致日志过多而难以排查问题。需要提醒用户谨慎使用较高的日志级别,特别是在生产环境中,因为过多的日志可能会影响性能,甚至导致磁盘空间不足。 另外,用户可能在执行命令时遇到权限问题,因为写入`/proc/sys/kernel/printk`需要root权限。应该提醒用户使用`sudo`或者以root身份运行命令,否则会出现权限被拒绝的错误。 还要考虑到不同Linux发行版的差异,比如某些系统可能使用systemd的`sysctl`来管理内核参数,直接修改`/proc`文件可能不会持久化,重启后会失效。这时候需要建议用户修改`/etc/sysctl.conf`或相关的配置文件,并使用`sysctl -p`来应用更改。 用户可能没有意识到修改这个参数的潜在风险,比如系统稳定性或安全性问题。需要提醒他们在生产环境中避免不必要的日志级别调整,仅在调试时使用,并在调试后恢复默认值。 最后,用户可能希望了解如何查看当前日志,比如使用`dmesg`命令,以及如何过滤特定级别的日志。这部分可以作为补充信息,帮助用户更好地理解和使用日志系统。</think>在 Linux 系统中,`/proc/sys/kernel/printk` 用于控制内核日志的输出等级。通过修改该文件的值,可以控制内核打印消息的详细程度。以下是详细说明: --- ### **1. 内核日志等级(Log Level)** 内核日志分为 8 个等级(数值越小优先级越高): | 数值 | 等级名称 | 说明 | |------|----------------|--------------------------------| | 0 | KERN_EMERG | 紧急(系统不可用) | | 1 | KERN_ALERT | 警报(需立即处理) | | 2 | KERN_CRIT | 严重错误(硬件/软件问题) | | 3 | KERN_ERR | 错误(影响功能) | | 4 | KERN_WARNING | 警告(潜在问题) | | 5 | KERN_NOTICE | 通知(正常但重要的事件) | | 6 | KERN_INFO | 信息(常规运行状态) | | 7 | KERN_DEBUG | 调试(详细调试信息) | --- ### **2. `/proc/sys/kernel/printk` 的格式** 该文件包含 **4 个数值**,格式如下: ```bash current_level default_level min_level boot_level ``` - **current_level**:当前控制台日志输出等级(默认 4)。 - **default_level**:系统默认日志等级(默认 7)。 - **min_level**:允许设置的最小等级(默认 0)。 - **boot_level**:启动时使用的日志等级(默认 4)。 **示例**: ```bash cat /proc/sys/kernel/printk # 输出:4 4 1 7 ``` --- ### **3. `echo 8 > /proc/sys/kernel/printk` 的含义** - **写入值 8**: 该命令将 **current_level** 设置为 8,表示允许输出所有日志(包括调试信息)。 但 Linux 内核日志等级的合法范围是 0~7,因此实际效果可能因系统而异: - **部分系统**:8 会被视为 7(KERN_DEBUG),开启最详细日志。 - **部分系统**:写入 8 会失败,提示无效参数(`Invalid argument`)。 --- ### **4. 推荐用法** - **开启调试日志**(输出所有级别): ```bash echo 7 > /proc/sys/kernel/printk ``` - **恢复默认设置**(仅输出警告及以上): ```bash echo 4 > /proc/sys/kernel/printk ``` --- ### **5. 永久生效** 临时修改重启后会失效,需修改配置文件: 1. 编辑 `/etc/sysctl.conf`: ```bash kernel.printk = 7 4 1 7 ``` 2. 应用更改: ```bash sysctl -p ``` --- ### **6. 查看内核日志** - 使用 `dmesg` 命令查看内核环形缓冲区日志: ```bash dmesg | less ``` - 过滤特定等级(如调试日志): ```bash dmesg --level=debug ``` --- ### **7. 注意事项** - **性能影响**: 开启调试日志(level=7)可能导致大量日志输出,影响系统性能。 - **安全性**: 调试日志可能暴露敏感信息,生产环境应避免长期开启。 - **权限问题**: 修改 `/proc/sys/kernel/printk` 需要 root 权限: ```bash sudo su -c "echo 7 > /proc/sys/kernel/printk" ``` --- ### **相关问题** 1. 如何通过 `dmesg` 过滤特定模块的日志? 2. `sysctl.conf` 中 `kernel.printk` 的四个参数分别作用是什么? 3. 内核日志等级 0~7 的优先级如何排序? 4. 修改 `/proc/sys/kernel/printk` 后如何验证生效? 5. 为什么写入 8 会导致 `Invalid argument` 错误?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loongembedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值