Android log相关文档索引:
使用ADB命令控制logcat日志本地存储功能-CSDN博客
Android系统通过属性设置来控制log输出的方案-CSDN博客
Android系统设置kernel log level的方法-CSDN博客
Android系统设置kernel log level的方法
背景
kernel log内容过多/过少会影响分析问题,各种系统的版本对kernel log的等级要求也不一样,因此需要对kernel log进行设置
使用平台
高通8775+Android 14
修改方案
1、动态修改kernel log level
适用场景:因为设备重启后重置,因此只适用于临时调试
修改步骤
查看当前log等级,进入adb shell
$ cat /proc/sys/kernel/printk 4 6 1 7修改log等级-->关闭所有kernel log,进入adb shell
echo 0 6 1 7 > proc/sys/kernel/printk //往printk文件写入“0 6 1 7”,关闭所有kernel log说明:只需修改第一个数即可,数值越小,优先级越高。
修改完查看
$ cat /proc/sys/kernel/printk      //查看修改后的kernle log
0       6       1       72、修改默认log等级
使用场景:适用于确认问题之后,明确什么等级适用当前系统
修改默认log等级,需修改相应的文件配置信息;这里使用最简单明了的方案,只从使用的角度来看这个问题,不去管它的原理;
查看平台默认kernel loglevel
$ cat /proc/sys/kernel/printk
4       6       1       7kernle log级别为4 6 1 7
修改kernel log默认值
以高通8775 Android 14平台为例,修改如下: device/qcom/common/rootdir/etc/init.qcom.sh
case "$buildvariant" in
    "userdebug" | "eng")
        #set default loglevel to KERN_INFO
-       echo "4 6 1 7" > /proc/sys/kernel/printk
+       echo "0 6 0 7" > /proc/sys/kernel/printk
        ;;
    *)
        #set default loglevel to KERN_WARNING
        echo "4 4 1 4" > /proc/sys/kernel/printk
        ;;
esac

修改完,重新编译即可
Kernel log level基础常识
确定了两种有效方案后,回头再了解一下内核日志的其他设置和参看方法,以及常识性问题。在Android设备中,内核日志(Kernel Log)对于调试和排查问题非常有用。以下是设置和查看Android内核日志的几种方法和步骤,包括如何通过命令行工具进行配置和查看。
printk文件解读
先了解下kernel log level是如何定义的,这部分内容在printk.c文件和kernel_level.h中。
该文件中4个数字,如“4 6 1 7”,根据日志记录消息的重要性/优先级(数值越小,优先级越高),定义将其发送到何处。 源码定义如下: /kernel_platform/msm-kernel/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 默认的控制台日志级别,控制台日志级别的缺省值*/
};
EXPORT_SYMBOL_GPL(console_printk);
也可在Google源码的kernel分支上进行查看

log等级的定义的源码在/kernel_platform/msm-kernel/include/linux/kernel_level.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 */这里定义了8个level的优先级,其中0的优先级最高,7的优先级最低,具体等级说明如下:
| 宏定义 | 级别 | 描述 | 
| KERN_EMERG | 0 | 紧急信息,此信息会引起系统崩溃 | 
| KERN_ALERT | 1 | 提示要马上采取某些行动 | 
| KERN_CRIT | 2 | 关键信息,通常有严重的软件或者硬件问题发生了 | 
| KERN_ERR | 3 | 通常用来报告错误,例如设备驱动通常会用来报告硬件操作失败等 | 
| KERN_WARNING | 4 | 警告信息,用来警告那些并不会造成严重的系统异常的问题 | 
| KERN_NOTICE | 5 | 用于正常但是值得注意的情况,比如大量安全相关的log | 
| KERN_INFO | 6 | 信息,许多驱动程序都会在硬件启动的时候使用这个级别打印Log | 
| KERN_DEBUG | 7 | 用于调试信息的打印 | 
如果KERN_DEFAULT = 4,那么printk默认的loglevel=4,那么0,1,2,3等级的log可以在控制台直接显示,4或4后面的log无法在控制台直接显示。
但是可以通过cat /proc/kmsg或dmesg的方式查看输出内容。
其他设置及查看方法
1. 查看内核日志
要查看Android设备上的内核日志,可以在adb shell中使用以下命令:
dmesg这个命令会输出内核日志消息。如果需要查看实时日志,可以使用:
dmesg -w2. 调整内核日志级别
内核日志级别决定了哪些类型的内核消息会被记录。可以通过以下命令查看当前的日志级别:
cat /proc/sys/kernel/printk输出四个数字,分别表示不同的日志级别:
<console_level> <default_level> <minimum_console_level> <default_console_level>例如,4 4 1 7 表示:
-  console_level: 4(错误及更严重的消息会输出到控制台)
-  default_level: 4(错误及更严重的消息会记录到环形缓冲区)
-  minimum_console_level: 1(最低记录到控制台的日志级别)
-  default_console_level: 7(日志的默认级别)
要调整日志级别,可以使用以下命令:
echo <new_console_level> > /proc/sys/kernel/printk例如,要设置日志级别为 3:
echo "3 4 1 3"/proc/sys/kernel/printk3. 配置内核日志
在构建自定义Android内核时,可以配置内核日志的详细程度:
-  CONFIG_PRINTK: 确保内核配置中启用了printk功能。
-  CONFIG_LOGLEVEL: 配置默认的内核日志级别,调整内核编译配置以设置这个值。通常在Kernel .config文件中可以设置。
例如:
CONFIG_PRINTK=y
CONFIG_LOGLEVEL=44. 使用logcat查看日志
 
logcat是Android的日志工具,但它默认查看的是用户空间的日志。如果你想要查看内核相关的日志,你应该使用dmesg。
如果你需要在logcat中查看来自内核的日志(通常这些信息会以kernel标签显示),可以使用以下命令:
logcat -b kernel5. 配置内核日志到文件
可以将dmesg的输出重定向到文件中以便于后续查看:
dmesg > /path/to/kernel_log.txt6. 设置内核日志参数
在内核启动时,可以通过引导参数来设置日志级别:
console=ttyS0,115200n8 printk.devkmsg=on在设备的/proc/cmdline文件中添加引导参数:
cat /proc/cmdline在引导引导参数中添加loglevel=4可以设置日志级别为4:
console=ttyS0,115200n8 loglevel=47. 通过/sys目录查看内核日志
也可以在/sys目录中查找内核日志相关的信息:
cat /sys/kernel/debug/dmesg8. 设置logcat过滤器
有时logcat也可以通过设置过滤器来帮助调试内核相关的问题:
logcat -b kernel -v time示例:设置内核日志级别和查看
# 查看当前内核日志级别
cat /proc/sys/kernel/printk
# 设置日志级别
echo "7 7 1 7" > /proc/sys/kernel/printk
# 实时查看内核日志
dmesg -w
# 将内核日志保存到文件
dmesg > /sdcard/kernel_log.txt参考链接
-  Android内核调试文档 









