[TOC]
目录
Android 日志框架使用(Timber/Logger/XLog)
1.Timber
Timber使用
Timber参考链接
2.Logger
Logger 使用
Logger 参考链接
3.XLog
XLog使用
XLog参考链接
Android 日志框架使用(Timber/Logger/XLog)
1.Timber
Timber
是个流行 Android 日志记录库,由 Jake Wharton 提供的, 对于Timber
源码地址(github): https://github.com/JakeWharton/timber
国内镜像(gitee): https://gitee.com/yinlingchaoliu/timber
Timber使用
dependencies {
...
implementation 'com.jakewharton.timber:timber:5.0.1'
}
如果想依赖其他版本可以查看仓库中Timber各个版本情况https://central.sonatype.com/artifact/com.jakewharton.timber/timber/versions
然后在Application中即可
Timber.plant(new Timber.DebugTree());
我们也可在初始的时候进行一些处理, 比如重写createStackElementTag
方法 让日志打印行号和类名
Timber.plant(new Timber.DebugTree() {
@Override
protected @Nullable
String createStackElementTag(@NotNull StackTraceElement element) {
return "(" + element.getFileName() + ":" + element.getLineNumber() + ")[" + Thread.currentThread().getName() + "]";
}
});
或者重写log
方法进行自定义的日志文件存储
Timber.plant(object : Timber.DebugTree() {
override fun createStackElementTag(element: StackTraceElement): String? {
return "(" + element.fileName + ":" + element.lineNumber + ")"
}
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
super.log(priority, tag, message, t)
if (priority == Log.ERROR) {
LogUtils.e(xxxx)//通过自定义的LogUtils进行 日志文件存储
} else {
LogUtils.d(xxxx)//通过自定义的LogUtils进行 日志文件存储
}
}
})
使用
Timber.d("Debug message");
Timber.i("Info message");
Timber.w("Warning message");
Timber.e("Error message");
Timber.i("Info message with %s", "formatting"); // 支持格式化
Timber.i("User %s logged in with id %d", username, userId);
Timber.e(throwable,"xxx Exception");
Timber参考链接
其他操作详细可以参考链接
Android 日志记录的最佳实践 https://blog.csdn.net/weixin_37600397/article/details/140286579
源码解析参考链接:
日志框架Timber使用与源码解析 https://www.jianshu.com/p/b464f59ba3cd
Android 常用三种日志框架[Logger、Timber、XLog] https://blog.csdn.net/banzhuantuqiang/article/details/141821636
三款 Android 日志框架对比「Logger、Timber、XLog」https://juejin.cn/post/7274982412245925928
2.Logger
Logger 是一个非常简单且轻量级的日志库,它提供了与 Timber 类似的功能,但没有那么多扩展性。它的主要优点是易于集成和使用。
源码地址(github): https://github.com/orhanobut/logger
国内镜像(gitee): https://gitee.com/tank-runner/logger
仓库中Logger 各个版本情况 https://central.sonatype.com/artifact/com.orhanobut/logger/versions
Logger 使用
依赖
implementation 'com.orhanobut:logger:2.2.0'
初始化
Logger.addLogAdapter(new AndroidLogAdapter());
//也可以进行配置
FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
.showThreadInfo(false) // (Optional) Whether to show thread info or not. Default true
.methodCount(0) // (Optional) How many method line to show. Default 2
.methodOffset(7) // (Optional) Hides internal method calls up to offset. Default 5
.logStrategy(customLog) // (Optional) Changes the log strategy to print out. Default LogCat
.tag("My custom tag") // (Optional) Global tag for every log. Default PRETTY_LOGGER
.build();
Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
//Save logs to the file
Logger.addLogAdapter(new DiskLogAdapter());
//Loggable
Logger.addLogAdapter(new AndroidLogAdapter() {
@Override public boolean isLoggable(int priority, String tag) {
return BuildConfig.DEBUG;
}
});
//Add custom tag to Csv format strategy
FormatStrategy formatStrategy = CsvFormatStrategy.newBuilder()
.tag("custom")
.build();
Logger.addLogAdapter(new DiskLogAdapter(formatStrategy));
//默认 Path为 Environment.getExternalStorageDirectory().getAbsolutePath()/ "logger"
使用
Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("What a Terrible Failure");
Logger.d(MAP);
Logger.d(SET);
Logger.d(LIST);
Logger.d(ARRAY);
Logger.json(JSON_CONTENT);
Logger.xml(XML_CONTENT);
Logger 参考链接
其他操作详细可以参考链接
android中logger使用 https://blog.51cto.com/u_16213341/12457597
3.XLog
XLog 提供了更丰富的特性,比如对多线程的支持、内置的文件写入支持以及更加灵活的日志格式化选项。
源码地址(github): https://github.com/elvishew/xLog
国内镜像(gitee): https://gitee.com/robchou/xLog
仓库中XLog各个版本情况 https://central.sonatype.com/artifact/com.elvishew/xlog/versions
XLog使用
依赖
implementation 'com.elvishew:xlog:1.11.1'
初始化
//简单的方式
XLog.init(LogLevel.ALL);
//高级方式
LogConfiguration config = new LogConfiguration.Builder()
.logLevel(BuildConfig.DEBUG ? LogLevel.ALL // 指定日志级别,低于该级别的日志将不会被打印,默认为 LogLevel.ALL
: LogLevel.NONE)
.tag("MY_TAG") // 指定 TAG,默认为 "X-LOG"
.enableThreadInfo() // 允许打印线程信息,默认禁止
.enableStackTrace(2) // 允许打印深度为 2 的调用栈信息,默认禁止
.enableBorder() // 允许打印日志边框,默认禁止
.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()
.addInterceptor(new BlacklistTagsFilterInterceptor( // 添加黑名单 TAG 过滤器
"blacklist1", "blacklist2", "blacklist3"))
.addInterceptor(new MyInterceptor()) // 添加一个日志拦截器
.build();
Printer androidPrinter = new AndroidPrinter(true); // 通过 android.util.Log 打印日志的打印器
Printer consolePrinter = new ConsolePrinter(); // 通过 System.out 打印日志到控制台的打印器
Printer filePrinter = new FilePrinter // 打印日志到文件的打印器
.Builder("<日志目录全路径>") // 指定保存日志文件的路径
.fileNameGenerator(new DateFileNameGenerator()) // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log")
.backupStrategy(new NeverBackupStrategy()) // 指定日志文件备份策略,默认为 FileSizeBackupStrategy(1024 * 1024)
.cleanStrategy(new FileLastModifiedCleanStrategy(MAX_TIME)) // 指定日志文件清除策略,默认为 NeverCleanStrategy()
.flattener(new MyFlattener()) // 指定日志平铺器,默认为 DefaultFlattener
.writer(new MyWriter()) // 指定日志写入器,默认为 SimpleWriter
.build();
XLog.init( // 初始化 XLog
config, // 指定日志配置,如果不指定,会默认使用 new LogConfiguration.Builder().build()
androidPrinter, // 添加任意多的打印器。如果没有添加任何打印器,会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
consolePrinter,
filePrinter);
打印日志
XLog.d("你好 xlog");
XLog.e(message, throwable);
XLog.d("你好%s,我今年 %d 岁", "Elvis", 20);
XLog.json(JSON_CONTENT);
XLog.xml(XML_CONTENT);
XLog.d(array);
XLog.d(list);
XLog.d(map);
XLog.d(intent);
XLog.d(bundle);
XLog.d(object);
Logger logger = XLog.tag("TAG-A")
... // 其他配置的覆盖
.build();
logger.d("定制了 TAG 的消息");
Logger logger = XLog.enableBorder()
.enableThread()
... // 其他配置的覆盖
.build();
logger.d("带有线程信息和日志边框的消息");
XLog.tag("TAG-A").d("定制了 TAG 的消息");
XLog.enableBorder().enableThread().d("带有线程信息和日志边框的消息");
XLog参考链接
Android 应用开发必备日志库 xLog https://www.jianshu.com/p/ea9767ce7608
(elvishwe 的官文)史上最强的 Android 日志库 XLog https://www.jianshu.com/p/1769d8aa1783
XLog 详解及源码分析 https://www.jianshu.com/p/15ff181cc2f8
其他
打印错误日志堆栈
Log.getStackTraceString(t);//通过 android.util.Log可以获取
//或者通过
Timber.e(e,"xxx Exception");
Logger.e(e,"xxx Exception")
XLog.e(message, throwable);
eg Timber.e后面上通过getStackTraceString
方法实现代码如下:
private fun getStackTraceString(t: Throwable): String {
// Don't replace this with Log.getStackTraceString() - it hides
// UnknownHostException, which is not what we want.
val sw = StringWriter(256)
val pw = PrintWriter(sw, false)
t.printStackTrace(pw)
pw.flush()
return sw.toString()
}
此外 Java时间戳字符串的优化 https://www.jianshu.com/p/45f78c3e779a