问题描述
想要了解如何将 /dev/log/main
的大小增加十倍。他的理解是日志具有固定大小(16K?),并且在达到限制时会翻转。用户想要找出当前日志大小设置,并将其大幅增加。
用户正在调试一个问题,该问题在设备长时间未使用(大约一个小时?)后偶尔出现。他已经在代码中加入了日志消息,以便在出现错误时了解发生了什么。
用户遇到的问题是,他的日志记录导致日志在约2分钟内翻转。他希望能够将 /dev/log/main
的大小增加十倍,如果可能的话。
解决方案
请注意以下操作可能涉及版本差异,以及修改前请做好备份。
方案1
从 Android 5 开始,内核中的 logger 驱动已被弃用,通过 /dev/log/*
字符设备公开了环形缓冲区。取而代之的是一个名为 logd 的用户空间日志守护程序管理着缓冲区 “main”、”system”、”radio”、”events” 和 “crash”。稍后还添加了可选缓冲区 “security”(例如用于 adb shell
/push
/pull
日志记录)以及在 userdebug
构建中的 “kernel”(用于 klogd
)和 “stats”(用于日志统计)。logd
主要涵盖了其桌面端的同名程序 syslogd
的功能,但也包括了 klogd
和部分 auditd
,以从内核的 SELinux 子系统获取日志。通过不同的 属性 来控制日志守护程序的行为。
应用程序和本地进程通过套接字 /dev/socket/logdw
(利用 liblog
函数)将它们的日志写入相关缓冲区。logcat
命令通过套接字 /dev/socket/logdr
从缓冲区读取日志,同时通过套接字 /dev/socket/logd
控制守护程序和缓冲区。使用 -g
/-G
选项来获取和设置单个缓冲区的大小:
-g, --buffer-size 获取环形缓冲区的大小。
-G <size>, --buffer-size=<size> 设置日志环形缓冲区的大小,可以加上 K 或 M 后缀。
在开发者选项中还有一个选项:Logger buffer sizes(也设置属性 persist.logd.size
)用于为所有缓冲区设置相同的大小。
persist.logd.size
从 /data/property/
中读取,除非挂载和解密了 /data
(在 FDE 的情况下)。但有时在那之前缓冲区可能会溢出,所以解决方案是在 logd
服务启动之前设置 ro.logd.size
(通过 default.prop
/build.prop
或直接在一些 *.rc
文件中)。
方案2
要找出环形缓冲区的实际大小,可以使用以下命令:
$ adb logcat -g
要调整环形缓冲区的大小,可以尝试以下命令:
$ adb logcat -G <kbytes>
至少某些教程是这样说的。欲了解更多细节,可以阅读 “adb logcat” Command Options and Log Buffers。
P.S.: 我猜那些设置(手动调整的环形缓冲区大小)不会在重启后生效,需要考虑这一点。
方案3
如果您想要在重启后持久地更改日志缓冲区的默认大小,可以重新编译内核以更新缓冲区大小。
包含日志缓冲区定义的文件是:
<kernel>/drivers/staging/android/logger.c
我看到的版本使用一个宏在该文件中定义日志缓冲区:
DEFINE_LOGGER_DEVICE(variable, name, size)
可能会有多个日志记录器;”main” 通常是您要查找的。