Android 基础库 - 调试体系 - 日志输出

本文详细阐述了日志系统的设计思路与实现细节,包括需求定义、功能点、功能边界等核心内容。深入探讨了日志等级控制、文件输出优化、日志命令处理及多输出流管理等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求定义

功能点

功能边界

备注

基本功能

与系统Android日志接口相同

TAG

 

 

等级

 

 

消息体

 

 

异常

 

 

特殊日志

 

 

Header

 

模块版本信息

线程名称

 

 

对象Dump

 

Log.d(TAG, “”, object)

扩展功能

 

 

可配置

配置文件

运行时配置命令

prop set debug.log show_toast true 

显示Toast

开关,可配置

show_toast=true

显示Trace

可配置

trace.PlayInfoForUI=[onInnerInfoChange]

调用上下文

类名,函数名

 

日志过滤

 

 

      等级控制

可配置

 

全局等级

 

 

TAG等级

 

priority.<TAG>=v

文件等级

 

 

    Dump控制

可配置

 

全局深度

 

 

TAG深度

 

 

写文件

只支持一个文件

 

日志格式

-vthreadtime

多线程安全性

文件大小

 

 

文件滚动

个数

多文件滚动

Java日志

可配置,可设置TAG(前缀)等级,提前过滤

第三方库一般使用java logger输出日志

多输出流

简单管理

 

控制台命令

 

实现运行时调试

日志输出

 

 

其他命令

trace

priority

 

日志线程

 

 

日志性能

 

 

压缩文件

 

批量日志文件

总体方案

  • 处理线程

在实际产生日志的线程同步处理,需要考虑时间性能优化,不能存在阻塞操作(写磁盘除外)。

  • 日志等级

两层等级控制:全局等级和TAG等级。TAG等级优先,没有定义的使用全局等级。

文件输出

使用线程局部存储(ThreadLocal)优化性能:

  1. 计算中间状态,减少重复工作
    1. 进程ID,% 6d
    2. 线程ID,% 6d
  2. 独立实例,消除线程同步锁
    1. 时间格式化:SimpleDateFormattor
    2. 字符串构建器:StringBuilder
    3. UTF8编码器:CharsetEncoder
  3. 固定缓存,减少分配释放销毁
    1. StringBuilder缓存
    2. UTF8编码缓存

日志命令

log [-w] [-f format] [-p priority] <tags>...

-w --wait:是否阻塞等待

如果等待,则其他线程的日志 post 到队列中,由执行命令的线程输出日志,命令执行线程被卡住;

如果不等待,命令立即返回,输出流不关闭,线程的日志直接输出,但是如果UI线程日志无法输出到网络上(会有异常)。

其他命令:

log trace -c <tag> [patterns]…

log priority -c <tag> <level>

需求与问题:

  • UI线程不是直接在网络上发送日志(已经解决)

UI线程不能直接在网络上发送日志,增加 -w 参数

  • 网络套接,不能检测到客户端断开(已经解决)

被 PrintWriter 抓住了 !!! ,调整后 OK 

  • 直接 dumpsys ,不能检测到客户端断开(已经解决)

原因同上

  • 通过 activity 服务中转的 dumpsys,会很快超时,而且会卡死UI线程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值