需求定义
功能点 | 功能边界 | 备注 |
基本功能 | 与系统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)优化性能:
- 计算中间状态,减少重复工作
- 进程ID,% 6d
- 线程ID,% 6d
- 独立实例,消除线程同步锁
- 时间格式化:SimpleDateFormattor
- 字符串构建器:StringBuilder
- UTF8编码器:CharsetEncoder
- 固定缓存,减少分配释放销毁
- StringBuilder缓存
- 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线程