一、前言
这里的 XLog 不是微信 Mars 里面的 xLog,而是elvishew的xLog。感兴趣的同学可以看看作者 elvishwe 的官文史上最强的 Android 日志库 XLog。这里先过一下它的特点以及与其余日志库的比较。文章主要分析 xLog 中的所有特性的实现,以及作为一个日志工具,它实际的需求是什么。
特点1.全局配置(TAG,各种格式化器...)或者基于单条日志的配置
2.支持打印任意对象以及可自己设置的对象格式化器
3.支持打印数组
4.支持打印无限长的日志(没有 4K 字符的限制)
5.XML 和 JSON 格式化输出
6.线程信息(线程名等,可自己设置)
7.调用栈信息(可配置的调用栈深度,调用栈信息包括类名、方法名文件名和行号)
8.支持日志阻拦器
9.保存日志文件(文件名和自动备份策略可灵活配置)
10.在 Android Studio 中的日志样式美观
11.简单易用,扩展性高
与其余日志库的区别1.柔美的源代码,良好的文档
2.扩展性高,可轻松扩展和强化功能
3.轻量级,零依赖
二、源码分析
1.官文架构
image.png
2.全局配置及其子组件详情// 日志输出样式配置LogConfiguration config = new LogConfiguration.Builder() .tag("MY_TAG") // 指定 TAG,默认为 "X-LOG" .t() // 允许打印线程信息,默认禁止 .st(2) // 允许打印深度为2的调用栈信息,默认禁止 .b() // 允许打印日志边框,默认禁止 .jsonFormatter(new MyJsonFormatter()) // 指定 JSON 格式化器,默认为 DefaultJsonFormatter .xmlFormatter(new MyXmlFormatter()) // 指定 XML 格式化器,默认为 DefaultXmlFormatter .throwableFormatter(new MyThrowableFormatter()) // 指定可抛出异常格式化器,默认为 DefaultThrowableFormatter .threadFormatter(new MyThreadFormatter()) // 指定线程信息格式化器,默认为 DefaultThreadFormatter .stackTraceFormatter(new MyStackTraceFormatter()) // 指定调用栈信息格式化器,默认为 DefaultStackTraceFormatter .borderFormatter(new MyBoardFormatter()) // 指定边框格式化器,默认为 DefaultBorderFormatter .addObjectFormatter(AnyClass.class, // 为指定类增加格式化器 new AnyClassObjectFormatter()) // 默认使用 Object.toString() .build();// 打印器Printer androidPrinter = new AndroidPrinter(); // 通过 android.util.Log 打印日志的打印器Printer SystemPrinter = new SystemPrinter(); // 通过 System.out.println 打印日志的打印器Printer filePrinter = new FilePrinter // 打印日志到文件的打印器 .Builder("/sdcard/xlog/") // 指定保存日志文件的路径 .fileNameGenerator(new DateFileNameGenerator()) // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log") .backupStrategy(new MyBackupStrategy()) // 指定日志文件备份策略,默认为 FileSizeBackupStrategy(1024 * 1024) .logFlattener(new MyLogFlattener()) // 指定日志平铺器,默认为 DefaultLogFlattener .build();
全局配置主要是为了根据业务需求进行相关的配置。xLog 的配置可以分成 2 个大类别:日志的输出样式以及日志输出的打印器配置。
LogConfiguration
LogConfiguration 的构造用是 Builder 设计模式。对于属性配置类,一般因为会有比较多的配置项,并且一般都会设定其默认配置值,所以大多都会选择采用 Builder 设计模式。
LogConfiguration.jpg
上图是一个在 Bu