• Android log 系统


    一、android log 架构

    在Android生态系统中有不同类型的日志: 主日志、Android系统日志、事件日志和Radio日志。主日志用于应用程序,events用于系统事件信息,radio用于电话相关信息,android system用于系统消息和调试。

    Android日志系统包括一个内核驱动程序和用于存储Android日志消息的内核缓冲区,用于创建日志条目和访问日志消息的C、c++和Java类,一个用于查看日志消息的独立程序(logcat),以及查看和过滤来自主机的日志消息的能力(通过Android Studio或ddms)。

    Linux内核中有四个不同的日志缓冲区,它们为系统的不同部分提供日志记录。所有的的缓冲区都在设备节点(硬件设备的虚化)“在/dev/log”下,有“/dev/log/main”, “/dev/log/radio”,“/dev/log/event”,“/dev/log/system”,分别对应主日志、事件日志、Radio日志和系统日志。

    主日志使用android.util.Log打印,主要被应用使用。

    系统日志使用android.util.Slog打印。许多android框架层的模块使用该工具打印日志,这样可以与应用日志区分开,避免其他日志干扰。

    事件日志使用android.util.EventLog打印,输出二进制格式的日志。日志入口包含二进制tag code,后面跟二进制参数。二进制tag code存储在 /system/etc/event-log-tags。

    /data/anr: Dalvik在anr上写堆栈跟踪,即“应用程序不响应”或“强制关闭”。

    /data/dontpanic: 包含一些崩溃日志,包括跟踪。

    /data/kernelpanics: —存储内核恐慌相关的日志。

    /data/tombstones: 可以保存多个tombstone_nn文件(nn是一个从0到10的数字,在10之后再次重复它)。

    1.1 Logd守护进程

    logd守护进程,开机时由 init 进程拉起;logd 内部维护了一个 RAM buffer 用作日志的缓存。各个进程的日志都会写入此缓存中。如果日志大小超过缓存限定,就会删除最老的日志。

    注意 logd 对外维护了 3 个 socket api :

    • dev/socket/logd : 传输控制指令

    • dev/socket/logw : 写日志

    • dev/socket/logr : 读日志

    1.2 写日志流程

    1.3 读日志

    1.4 日志解析

    不同于写日志的流程,日志在保存时是有特定的格式去存储。在读取时 logcat 作为读取的客户端是需要先对日志进行格式解析,并拼接为命令行可见的字符串,因此有了 processBuffer 的过程。同时 logcat 打印日志超过了文件大小限制,就需要调用 rotateLogs 函数去建立新的文件。

    1.5 日志打印消耗资源

    1:进程通信: 日志信息通过 socket 发送给 logd。

    2:cpu 消耗: logd 中 ring buffer 会经常进行 pruneLogs 操作,删减日志,耗费CPU资源。

    3:内存占用:logd 中维持对应的 buffer,RAM 的消耗。

    4:io 读写消耗:在应用程序中 ,创建后台线程保存日志信息,这回导致应用或者整机卡顿。

    二 、logd

    2.1 知识点:

    logd 是日志系统的核心进程,由 init 启动,是属于守护进程常驻后台 ② logd 维护各个日志节点缓存队列,提供 socket 接口进行读、写、控制功能 ③ logd 进程启动后,分别启动 LogReader、LogListener、CommandListener 三个线程,监听并处理来自三个 socket 的消息。在收到消息后,会通过 LogBuffer 类保存日志到对应的 RAM buffer 中 ④ LogAudit 模块用于接收 Kernel selinux 信息,即可以在用户空间打印 selinux 日志信息 ⑤ LogKlog 用于接收 kernel 日志信息,通过设置 property ,可以通过 logcat 命令读取内核日志 ⑥ LogStatistics 是日志统计模块,默认开启统计数据较少,仅能以 pid/uid 纬度统计打印日志的数量。如果设置了 logd.statistic = true 。会打印更多纬度的统计信息,包括哪些 pid/uid/tid/TAG 日志量比较大,可用于日志裁剪相关

    2.2 logd 启动流程

  • 相关阅读:
    34-基于stm32单片机简易数字示波器设计(实物图+原理图+PCB+参考论文)
    [Linux系统编程]文件重定向dup和dup2
    组装电脑选择硬件怎样辨别真伪好坏
    金仓数据库KingbaseES客户端编程接口指南-JDBC(12. 在应用服务器中配置JDBC)
    【原创】K8S环境下研发如何本地调试?kt-connect使用详解
    47、以Orienmask实例分割算法为例子,学习TensorRT的Python和C++开发
    指针——C语言初阶
    前端知识学习案例9-开发企业网站9-实现关于我们的部分2
    WindowsServer下配置Mysql主从同步---Mysql主从复制同步001
    12.3 实现模拟鼠标录制回放
  • 原文地址:https://blog.csdn.net/jx232515/article/details/127622049