概述
了解对日志的认知
什么是日志?
日志有什么作用?
日志记录系统概览
Android 日志记录系统是系统进程 logd 维护的一组结构化环形缓冲区。这组可用的缓冲区是固定的,并由系统定义。最相关的缓冲区为:main(用于存储大多数应用日志)、system(用于存储源自 Android 操作系统的消息)和 crash(用于存储崩溃日志)。每个日志条目都包含一个优先级(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一个标识日志来源的标记以及实际的日志消息。
Logcat
常用命令
以下是一个过滤器表达式的示例,该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息:
adb logcat ActivityManager:I MyApp:D *:S
上述表达式中最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示标记为“ActivityManager”和“MyApp”的日志消息。使用 *:S 是确保日志输出受限于您已明确指定的过滤器的绝佳方式,它可以让过滤器充当日志输出的“许可名单”。
以下过滤器表达式显示了优先级不低于“警告”的所有标记的所有日志消息:
adb logcat *:W
查看已经过解译的二进制系统事件缓冲区消息。
adb logcat –b events
官方文档介绍
Logcat 命令行工具 | Android 开发者 | Android Developers (google.cn)
使用 Logcat 写入和查看日志 | Android 开发者 | Android Developers (google.cn)
框架介绍
框架图

模块介绍
Framework:android应用框架
libandroid_runtime:android 运行时(ART)实例库
native:android本地应用
Logcat:是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。
liblog:代表了 NDK(原生)应用程序和库的易失性 Android 日志记录系统的接口。用于写入或读取日志的接口。日志缓冲区分为主日志、系统子日志、无线电子日志和事件子日志。
logd:作为日志系统的服务端,通过socket与liblog传递日志数据和控制命令
liblog
应用层写入日志流程

Native写入日志流程

Logcat读取日志流程

Logcatd初始化流程

logd
初始化流程

这里有两个进程初始化logd和logd-reint
都是通过system/bin/logd的二进制bin文件启动,只是参数的不同

内部组件介绍

LogReader 监听 /dev/socket/logdr。 当客户端连接时,LogBuffer 中的日志条目会写入客户端。
LogListener 在 /dev/socket/logdw 上侦听客户端启动的日志消息。 新的日志条目被添加到 LogBuffer 并通知 LogReader 将更新发送到连接的客户端。
CommandListener 在 /dev/socket/logd 上侦听传入的 logd 管理命令。
LogAudit 在 NETLINK_AUDIT 套接字上侦听 selinux 启动的日志消息。 新的日志条目被添加到 LogBuffer 并通知 LogReader 将更新发送到连接的客户端。
LogKlog在/proc/kmsg上监听kernel上的日志消息,新的日志条目被添加到 LogBuffer 并通知 LogReader 将更新发送到连接的客户端。
内部组件类图

Loglistener写入流程

Logreader读取流程

结语
总结
Android 日志系统整体通过liblog作为接口提供给客户端使用,logd作为服务端收集系统相关日志,并提供读取日志功能,logcat作为日志工具可以读写并转发存储指定文件
kmsg日志的存储与读取 - 知乎 (zhihu.com)
1604

被折叠的 条评论
为什么被折叠?



