Android使用Logger开发App本地日志记录功能
前言
记录日志是一个App常用的功能,很多软件都会有,它能帮助开发者快速确定问题位置,可以说是App维护的基础。
项目现状
之前我们的项目没有记录日志到本地的功能,每次排查问题都非常的费劲,需要本地能复现才能解决问题,但是有些问题并不是我们本地能复现的,比如客户环境在内网,无法访问,或者只有特定手机出现问题,这时候我们就束手无策了。
开发目的
为了更好的手机问题信息,并且让用户简单的去获取日志,发给开发者,我们急需记录日志到本地的功能,并且提供开关给客户,让客户方便的进行操作。
探索过程
经过搜索对比,最终选取了Logger日志库作为开发的基础,这个库比较知名,出了问题也有很多资料,而且使用简单,功能全面,甚至提供了基础的记录日志到本地的能力,应该能满足我们的需求。
这个库的地址是https://github.com/orhanobut/logger
但是这个库有一些小问题需要我们通过开发去补全。
- 记录的文件名字需要改变,标记日期,否则用户不知道哪个日志是最新的,不好发过来
莫默认情况是这样的,我们想加上日志标识,让用户看得懂
- 需要有一个开关来控制是否开启记录,并且在一定时间之后自动停止记录,并删除超期的日志文件,这一步主要是为了app的安全性,否则通过日志会泄露一些重要的信息
比如这样 - 为了单独分析网络请求情况,我们还需要把网络请求信息单独放到一个文件里面,也就是一个logger同时往两个文件输出日志
具体步骤
- 集成logger,并按照官方文档实现记录日志到本地功能
这一步很简单,照着官方文档做就行了 - 修改logger的TextDiskLogStrategy和TextFormatStrategy文件,实现日志的分文件、路径存放
这一步需要把logger的源码进行一些改造,具体来说分为两个部分
1.TextDiskLogStrategy – 继承FormatStrategy,在内部可以通过log方法给日志信息加一些附加信息,比如时间戳或者换行,并且定义一个handlerthread并获取handler,方便子线程使用它来往文件里写日志
2.TextFormatStrategy–继承自LogStrategy,使用handler进行日志的写入工作,通过what类型的不同,写入到不同的目录
通过tag不同,发送不同的message
内部还有个处理的handler,用来接收并真正执行日志文件的写入,根据不同类型写入不同文件,并且对日志使用加密算法加密,保证客户不能直接读取文件内容,确保安全性。至于如何加密,就可以根据实际情况使用不同的算法进行操作。
- 写一个工具类,通过开关来控制是否进行日志的输出操作,并定时关闭开关
- 每次app启动的时候,扫描日志目录,判断文件创建时间,如果超过三天,就删除
- 使用一个shareprefrence的值来保存是否开启调试模式,并记录开启时间,每次应用启动的时候检测这两个值,并比较,如果超过时间就把debug变量还原,这样就不会继续输出日志了
关于安全性的考量
由于日志里面记录的信息有可能涉及一些敏感的东西,我们必须做好防护,上面说到的三天之后删除,24小时自动关闭记录,加密日志都是为了防止用户敏感信息泄露出去。
这个功能只能在用户知情的情况下,主动开启,并且只能使用有限的时间。
回顾总结
这个功能开发起来并不是非常困难,但是结合产品的过程可以引发一些思考
- 为了获取信息的便捷性,这个功能不可或缺,否则很多问题光靠开发复现费时费力
- 为了记录的清晰,要把网络请求和logcat日志分开记录
- 为了用户信息的安全,需要设置开关和自动关闭功能,并且给日志加密
以前做一个功能的时候,考虑的可能就是实现这个功能,记录日志这个功能其实非常简单
但是要考虑到安全性和易用性,做起来还是有很多的工作,写代码的过程往往就是简单功能,复杂实现
为了堵住所有可能的口子,往往需要对一个功能有更全面的思考,开始思考这些问题,也是编程经验提升的一种象征。