LogX¶
LogX 一个小而美的日志记录框架;既有 Timber 的易用性与可扩展性,又具备 Logger 的日志格式美观性。
写这个日志框架的主要原因是为了简化维护流程。在我个人的GitHub开源项目中,有一些需要使用日志功能的库。 最初,我使用的是一个自维护日志工具类:LogUtils,当开源项目数量较少时,这种方法还比较有效。 然而,随着开源项目数量的增加,我不得不频繁地复制和维护LogUtils,随着时间的推移,不同开源项目中的LogUtils可能会 出现一些差异,这大大增加了维护的难度。因此,我开始考虑更加优雅的解决方案。在经过一段时间的思考和研究后,我决定 结合平时使用的 Timber 和 Logger 这 两个成熟的开源库,取其精华,编写一个新的日志框架,即:LogX 。
类图¶
从上面的类图可以明确的看出 LogX 内部之间的关系与结构。
引入¶
Gradle:¶
-
在Project的 build.gradle 或 setting.gradle 中添加远程仓库
repositories { //... mavenCentral() }
-
在Module的 build.gradle 里面添加引入依赖项
implementation 'com.github.jenly1314:logx:1.1.0'
使用¶
基本用法¶
如果没有特殊的要求,直接使用即可。
LogX 无需初始化,因为 LogX 的默认配置就是个人最推荐的配置。(这也是我写 LogX 的原因之一)
主要的一些方法调用示例如下:
LogX.v("verbose");
LogX.d("debug");
LogX.i("info");
LogX.w("warn");
LogX.e("error");
LogX.wtf("assert");
占位符格式化示例如下:
LogX.d("hello %s", "world");
当未指定tag时,内部会自动通过线程栈获取对应的简单类名来作为tag,上面的示例皆是如此;不过你也可以自己指定tag;
指定tag示例如下:
// 指定tag(指定的tag是一次性的)
LogX.tag("MyTag").d("debug");
看了上面的基本用法,相信你已经会使用 LogX 了;如果还想了解更多,你可以继续往下看高级用法。
高级用法¶
如果你有特别的需求,你可以自己按照喜好进行配置DefaultLogger
或自定义实现Logger
。
// 参数1:是否显示线程信息; 参数1:显示多少方法行,;参数3:方法栈偏移量
Logger logger = new DefaultLogger(true, 2, 0);
LogX.setLogger(logger);
全局配置是否记录日志示例如下:
LogX.setLogger(new DefaultLogger() {
@Override
protected boolean isLoggable(int priority, @Nullable String tag) {
// return super.isLoggable(priority, tag);
// 例如:只在开发模式才记录日志
return BuildConfig.DEBUG;
}
});
LogX 默认配置就是在debug包下才开启日志记录的,release包默认是关闭日志记录的。
使用CompositeLogger
管理Logger
示例如下:
CompositeLogger compositeLogger = new CompositeLogger();
// 添加任意的Logger实现即可;例如:DefaultLogger
compositeLogger.addLogger(new DefaultLogger());
LogX.setLogger(compositeLogger);
如以上内置的功能都不满足你的需求,你还可以自定义实现一个
Logger
。
日志效果¶
日志的默认输出格式如下:
┌──────────────────────────────
│ Thread information
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ Method stack history
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ Log message
└──────────────────────────────
关于FormatUtils
(v1.1.0新增)¶
格式化json
和xml
本不属于日志打印的范畴,但为了提升可读性和美观性,决定提供一个工具类FormatUtils
来支持此功能。至于是否需要格式化,由开发者根据实际需求自行决定。
格式化json示例:¶
String json = "{\"key\": \"value\", \"array\":[\"item1\",\"item2\"]}";
// 打印格式化后的json
LogX.d(FormatUtils.formatJson(json));
格式化xml示例:¶
String xml = "<root><key>value</key><array><item>item1</item><item>item2</item></array></root>";
// 打印格式化后的xml
LogX.d(FormatUtils.formatXml(xml));
特别说明¶
既然 LogX 的实现主要是参考了:Timber 和 Logger,那么二者的诸多优点,LogX 自然也是支持的。
比如:如果你之前是集成使用的Timber,那么现在你也可以通过如下方式,将最终的日志输出转到 LogX,让日志输出格式更具美观性。
Timber.plant(new Timber.Tree() {
@Override
protected void log(int priority, @Nullable String tag, @NonNull String message, @Nullable Throwable throwable) {
// if(tag != null) { // 这里的tag可要可不要
// LogX.tag(tag);
// }
// 在Timber目前层级没发生变化的情况下,方法栈偏移4 即可准确定位到原始Timber调用的代码所在行。(这里不需要throwable,因为message里面已经包含了)
LogX.offset(4).log(priority, message);
}
});
通过使用
LogX.offset(offset)
进行方法栈的偏移,就算多库混用也互不影响,都可以轻松的定位到日志具体的代码行。