Android 日志系统7——Android 平台日志丢失问题分析

目录

  • 前言
  • 一、案例分析
    • [1.1 业务日志输出频率太高](#1.1 业务日志输出频率太高)
    • [1.2 整机负载高](#1.2 整机负载高)
    • [1.3 存储异常导致](#1.3 存储异常导致)
    • [1.4 低内存导致](#1.4 低内存导致)
  • 二、资源消耗问题

|------------------------|
| Android 平台日志丢失问题分析 |

前言

下面针对一些典型场景缺通用日志(android/kernel)的问题,一一列举如下,希望可以让大家关注到缺日志的真实原因。如下问题也提醒各位工程师: 谨慎添加日志,不要随意添加,否则极容易造成自己的日志缺失也会导致其他业务模块丢失日志。

通用日志丢失目前有如下情况会出现:

  • (1) liblog通过socket传输日志时失败,此时在event日志中会记录类似上图中tag=liblog的埋点。具体见1.1、1.2节内容。

  • (2) 其它进程通过socket读取logd的日志时,此时由于日志打印速度过快,读取速度跟不上写入速度,造成了部分历史日志被丢弃的情况,此时在event日志中会记录tag=chatty的埋点。此种情况遇到较少。

  • (3) logd buffer中日志内存超过buffer大小了,则会按照每次裁剪日志的行数等于日志总行数的10%,并且会大于等于4行,小于256行。环形buffer大小超过了,会不断循环裁剪。

  • (4) 文件存储问题,导致日志内容无法落盘至日志文件。具体见1.3节内容。

  • (5) 低内存查杀日志进程,导致日志内容无法落盘。具体见1.4节内容。

日志丢失的问题可能不止以上原因,基本分析思路是首先了解问题发生场景及时间点,然后通过日志抓取和落盘场景进行分析,参考业务日志打印频率、logd的状态(logd的cpu负载、运行状态)、系统的异常状态(严重低内存、整机CPU负载高、文件系统异常、温度过高限频限核)等综合原因,得出问题分析结论。往往日志缺失和系统状态联系较为紧密,所以分析此类问题,就要具备开阔的视野,能够及时联想到有关整机各个状态,推测和佐证自己的分析原因和得出的结论。具体分析过程,也可以参考思维导图。

下面针对以上内容,列举如下几个典型案例,仅供参考。

一、案例分析

1.1 业务日志输出频率太高

(1) events日志出现大量丢弃日志打印

(2) 查看android日志,发现sensor日志打印量非常大,基本达到刷屏的程度

(3) android日志输出频率达4229条/秒,日志输出频率非常大,sensor日志打印处于top1,达到2418条/s。

总结:sensor日志打印频率太高,超过了socket的处理能力,不能及时处理只能先行丢掉。故导致部分日志丢失。

1.2 整机负载高

(1) 输出的日志出现大量的日志丢失内容

(2) 查看日志打印频率,发现日志输出频率较低

(3) 查看systrace发现整机负载高达90%以上,logd一直处于runanble状态,整机温度也较高导致触发了限频限核。

总结:logd一直处于runnable状态,导致logd无法获得cpu时间片执行日志操作,容易出现socket通信失败,故导致部分日志丢失。

1.3 存储异常导致

(1) 查看日志发现mmap异常

(2) 由于没有过多日志打印,故本地使用adb logcat抓取日志分析

总结:文件存储出现问题,日志无法输出到对应的文件中,日志信息无法得到落盘,故出现日志内容大量丢失。

1.4 低内存导致

(1) 日志文件为空

(2) kernel日志中发现打印日志进程被杀

(3) 查看内存,已经处于低内存状态

总结:低内存导致日志进程被杀,出现日志文件无对应的日志信息落盘,故出现日志内容丢失。


二、资源消耗问题

打印日志是非常消耗资源的,原因可概括如下:

  • (1) 跨进程通信的消耗:日志信息通过 socket 发送给 logd,存在跨进程通信的消耗;

  • (2) 内存消耗:logd 中维持对应的buffer,存在相应RAM的消耗,往往低存储机器在低内存过程表现尤为突出;

  • (3) CPU资源消耗:logd中ring buffer会经常进行 pruneLogs操作,进行删减日志,会耗费一定的CPU资源;业务日志打印太多容易导致logd在一段时间出现cpu负载非常高的现象;

  • (4) IO消耗:在应用程序中 ,创建后台线程保存日志信息,这会导致应用或者整机卡顿。

  • (5) 功耗消耗:往往业务日志打印较多,导致logd的cpu负载非常高,直观表现就是发热和续航恶化。

  • (6) 性能消耗:日志打印过多,也容易导致界面操作卡顿,从而表现出整机性能方面的消耗。

所以,规劝大家在打印日志过程一定要注意。在正式版本中,一定要规范日志打印,要有系统资源消耗及整机性能的意识。最好建立自己模块的故障检测能力,平时做到少量日志打印,遇到故障可以适当增加日志打印。


相关推荐
Kapaseker12 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴12 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker2 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋2 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter