使用 Timber
- 配置 timber
implementation 'com.jakewharton.timber:timber:4.7.1'
可以直接在Application的onCreate()中调用
Timber.plant(new DebugTree())
实现Debug功能。但是功能有所欠缺,可以用来上传crash信息等。ps:
Timber主要通过添加Tree实例来实现,添加Tree实例可以通过方法Timber.plant完成。
而使用DebugTree实现自动实例化
- 不会打印当前线程
- 不会打印当前行号
自己创建一个继承类来实现这两个功能。
class ThreadAwareDebugTree : Timber.DebugTree() {
//添加当前线程
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
if (tag != null) {
val threadName = Thread.currentThread().name
tag != "<" + threadName + ">"
}
super.log(priority, tag, message, t)
}
// 添加行号
override fun createStackElementTag(element: StackTraceElement): String? {
return super.createStackElementTag(element) + "Line(" + element.lineNumber + ")"
}
}
还有一个类在 release 版本时调用打印log信息
release 版本用来以一种跟踪日志的形式上报给 Bugly,它只会显示 w,e,wtf。
class ReleaseTree : ThreadAwareDebugTree() {
override fun isLoggable(tag: String?, priority: Int): Boolean {
return if (priority == Log.VERBOSE || priority == Log.DEBUG || priority == Log.INFO) {
false
} else true
}
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
if (!isLoggable(tag, priority)) {
return
}
super.log(priority, tag, message, t)
}
}
- 准备 Application
class TimberDemoApplication : Application() {
override fun onCreate() {
super.onCreate()
if (DEBUG)
Timber.plant(ThreadAwareDebugTree())
}
}
- 调用一个log
println(Timber.v("hello"))
重写 Log 方法
参数
priority:Int 优先级
tag:String 打印时的标签
message:String 内容
t:Throwable 抛出的异常
此方法可以用来根据发送来的 异常等信息 自定义接下来的动作。这些信息并不会被从log日志打印出来。
调用
Timber.log(1, "测试打印")
打印我们发送来的信息
class MyTimberFree : Timber.Tree() {
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
super.log(priority, tag, message, t)
Timber.v(message)
}
}
为什么使用Timber
项目开发时,为了方便调试,需要输出log,但是发布后,log中包含很多项目信息,如果全部暴露可能会造成安全隐患,当完全删除也不利于后期调试,因此需要一个开关,关闭开关不能输出bug,打开开关则可以输出log。
每次需要打印 TAG
不会打印当前线程
不会打印当前行号