前言:Log日志在Android項(xiàng)目開(kāi)發(fā)中的作用非常重要,但項(xiàng)目越做越大,開(kāi)發(fā)者會(huì)面臨很多問(wèn)題,比如管理各種不同的Log,不同版本控制是否輸入Log等。Timber是一個(gè)輕量級(jí)的第三方庫(kù),能夠幫助開(kāi)發(fā)者更好的使用Android Log。
面臨問(wèn)題
- 項(xiàng)目使用Log規(guī)范不統(tǒng)一,例如:關(guān)于okhttp的實(shí)現(xiàn)使用了Logging Interceptor輸出log,關(guān)于rxjava的實(shí)現(xiàn)使用了onError,其他使用了Android Log機(jī)制
- 項(xiàng)目開(kāi)發(fā)時(shí),為了方便調(diào)試,需要輸出Log,但發(fā)布后,Log中包含很多項(xiàng)目相關(guān)的信息,如果全部暴露會(huì)有安全隱患,但完全刪除也不利于發(fā)生問(wèn)題后的查看調(diào)試,因此需要一個(gè)開(kāi)關(guān),關(guān)閉開(kāi)關(guān)則不能輸出log,打開(kāi)開(kāi)關(guān)則可以輸出log
Timber 介紹
Timeber的使用主要通過(guò)添加Tree實(shí)例,添加Tree實(shí)例可以通過(guò)方法Timber.plant完成。實(shí)例化Tree需要盡量早,推薦在項(xiàng)目Application的```onCreate()````方法中完成。
其中,DebugTree自動(dòng)實(shí)例化,是Timber中已經(jīng)實(shí)現(xiàn)了tree的類(lèi),可直接拿來(lái)用,并在使用他的類(lèi)中以類(lèi)名為其TAG,但是其他的Tree不會(huì)自動(dòng)實(shí)例化,需要進(jìn)行手動(dòng)實(shí)現(xiàn)擴(kuò)展Timber.Tree實(shí)現(xiàn)。
下載
在build.gradle中
compile 'com.jakewharton.timber:timber:4.5.1'
注冊(cè)
在onCreate()中
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
} else {
Timber.plant(new CrashReportingTree());
}
private static class CrashReportingTree extends Timber.Tree {
@Override
protected void log(int priority, String tag, String message, Throwable t) {
}
}
使用
Timber.tag("activityName");
Timber.d("Activity Created");
好處
- 不再重復(fù)使用TAG。之前使用Log方法每次使用都需要定義并傳入一個(gè)TAG,在Timber中,若使用DebugTree,默認(rèn)為當(dāng)前類(lèi)類(lèi)名,若使用自定義Tree,直接定義一次,到處使用,不需重復(fù)設(shè)置
- 在打Timber調(diào)用處,不僅可以只輸出Log,還可以執(zhí)行其他操作。比如:存到數(shù)據(jù)庫(kù),進(jìn)行輸出,Socket傳輸,甚至顯示到UI界面上等,只需要自定義Tree,并將對(duì)應(yīng)邏輯在
log(int priority, String tag, String message, Throwable t)方法中實(shí)現(xiàn) - 統(tǒng)一項(xiàng)目Log日志方法,輸出形式,輸出時(shí)間,更加符合面向?qū)ο笏枷?/li>
isLoggable 方法作為開(kāi)關(guān)控制Log輸出
語(yǔ)法
boolean isLoggable (String tag, int level)
通過(guò)指定標(biāo)簽指定級(jí)別,控制日志是否顯示。默認(rèn)級(jí)別為Info,表示高于或等于Info級(jí)別的日志都可以顯示。
設(shè)置
- 遠(yuǎn)程設(shè)置系統(tǒng)屬性更改默認(rèn)級(jí)別
adb -d shell setprop log.tag.<YOUR_LOG_CAT> <LEVEL>
- 系統(tǒng)目錄
/data/local.prop,創(chuàng)建一個(gè)local.prop文件,文件內(nèi)容:
log.tag.<YOUR_LOG_TAG>=<LEVEL>
Level級(jí)別
| LEVEL | NUMBER |
|---|---|
| VERBOSE | 2 |
| DEBUG | 3 |
| INFO | 4 |
| WARN | 5 |
| ERROR | 6 |
| ASSERT | 7 |
例子
在自定義Tree中的log方法中進(jìn)行控制,若為Debug環(huán)境下,可以產(chǎn)出log;若為Release環(huán)境,且打開(kāi)開(kāi)關(guān),則可以產(chǎn)生log;若為Release環(huán)境,且關(guān)閉開(kāi)關(guān),則不可產(chǎn)生log。
-
Java代碼如下
- 命令行中
若執(zhí)行如下命令,則打開(kāi)開(kāi)關(guān),可以產(chǎn)生log
adb -d shell setprop log.tag.MyTag DEBUG
若執(zhí)行如下命令,則關(guān)閉開(kāi)關(guān),不可產(chǎn)生log
adb -d shell setprop log.tag.MyTag WARN
