9:20 AM
Wednesday, December 28, 2022 (GMT+8)
Time in Guangzhou, Guangdong Province, China


[toc]

背景

通常在Android中使用logcat输出查阅日志,但有时日志很长,可能会被截断,显示不完整。

注意,这里指的是单条日志太长了被截断了,不是指日志太多了被冲掉了

本文研究日志被截断的原因,并给出修改方法。

首先日志被截断的原因有如下几种,其中第一种是首要原因:

  1. 单条日志长度上限,日志如果太长,触及上限则会被截断
  2. 日志如果涉及序列化、binder传输,则受到binder传输上限的限制
  3. 底层(Linux、log设备)限制、系统调用限制

注意,单条日志长度上限是指一次打印的日志的长度,不是指设置-开发者选项-日志缓冲区大小。

查看日志缓冲区大小、单条日志大小

1
2
3
4
5
#:/ logcat -g
main: ring buffer is 16 MiB (15 MiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 16 MiB (6 MiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 16 MiB (13 KiB consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 16 MiB (3 MiB consumed), max entry is 5120 B, max payload is 4068 B

通过logcat -g指令可以读到各个分类的缓冲区上限、目前用量、每次读取量、单条日志长度的上限。

调节日志缓冲区大小

  • 法1: 开发者模式-设置日志缓冲区大小
  • 法2: 通过logcat -G即可设置,等同于法1

调节单条日志大小

修改代码根目录下的system/core/liblog/include/log/log_read.h下的LOGGER_ENTRY_MAX_PAYLOADLOGGER_ENTRY_MAX_LEN

修改后,需要重新编译如下三个模块: liblog logd logcat,推入设备,重启方能生效。(通过logcat -g可以验证修改)

不同Android版本在不同位置,比如这个