上周计划是分享下Espresso源码,因为平时在用,也想一探究竟,但深入之后发现要看的东西有点多,一时半会还写不完,我又不想断了每周一更的习惯,就找了一个简单的来写,哈哈,虽然简单但比较实用,没错,就是日志工具类,如果在开发过程中没有好的日志工具类库,看起来总是特别累,而我之前也在考虑写一个自己的日志工具类库,因为目前的日志工具类用起来总是特别麻烦,可能就在很小的点上,当然这是后话,等我写完了可以和大家分享。Logger在Github上获得3K以上的star,也算的得到大家的认可,我就拿来借鉴下。
简介
Logger是一个简单也很强大的Android日志工具类库,支持功能如下:
- 线程信息输出
- 类信息输出
- 方法信息输出
- Json信息输出
- XML信息输出
- 跳转到源码
使用也很简单,
Logger.init("MainActivity");
Logger.d("hello");
Logger.json(JSON_CONTENT);
Logger.xml(XML_CONTENT);
输出结果如下:
具体方法可以直接去看使用文档,我在这里就不复述了,直接来看下源码吧。
源码分析
UML类图
通过UML类图,我们可以看到Logger结构非常简单,一共就6个主要类:
- Logger:用其进行日志输出
- Printer:打印抽象类
- LoggerPrinter:Printer实现类,调用LogTool进行日志打印
- Setting:设置类,用于管理methodCount(方法日志输出的行数)、showThreadInfo(是否显示线程信息)、logTool等
- LogTool:日志工具抽象类
- AndroidLogTool:android日志工具实现类
我们可以看到类库虽然简单,但遵循开闭原则,该类库可以通过替换掉AndroidLogTool直接用在其他Java平台,非常的灵活。该类库最大的的特点就是通过输出一些格式化的信息来让输出日志直观。
小中见大
源码比较简单,对结构分析完之后,看到具体实现的时候,ThreadLocal的使用引起了我的注意,用于多线程内部局部变量,保证在多线程的情况下变量独立,至于具体的实现推荐大家看下解密ThreadLocal,写的非常棒,特别是里面对于内存泄露的处理,我就不好意思再写了。
缺点
算不上缺点,只从功能层面来说。
- 按我的需求来看,过于简单,除了基本的日志输出之外,只提供XML和JSON格式的输出,建议提供List的输出,如果有可能可以提供对象数据的输出,目前的思路是通过反射打印出变量,主要用于Model类,这也是我之后考虑拓展该类库的思路
- 从Issue中也能看到一些不足之处,例如Json和Xml输出,没有logType,不过这些也是我们可以直接进行拓展的。
总结
我希望通过这种开源库的分享,结合自己开发类似功能类库的对比,找到自己代码设计中的不足,带来自己的一些思考,也去发现别人的不足,参与其中,我想这样会对我们帮助很大。让我们一起向着更优秀前行。
参考资料
可以随意转发,也欢迎关注我的简书,我会坚持给大家带来分享。