:## 為什么
為什么要尋找單獨(dú)的logger庫(kù)?用Andorid原生的Log不好嗎?原生Log長(zhǎng)得這樣:
先分級(jí),再打上TAG,然后直接輸出。功能很基礎(chǔ),平時(shí)基本夠用。但是在長(zhǎng)期的Android開發(fā)實(shí)踐中,我們會(huì)發(fā)現(xiàn),這個(gè)功能太基礎(chǔ)了,當(dāng):
- 每次打TAG都要寫下雷同的代碼,太不DRY了。
- 想打印的數(shù)據(jù)各種打不出,要么就是打出來(lái)一長(zhǎng)串看的發(fā)暈。
- 為了找某條log是從哪里打出來(lái)的,還要花點(diǎn)功夫。
- 即使找到了,怎么知道運(yùn)行時(shí)是在哪個(gè)線程?
- 日志去了不再來(lái)。在未連接調(diào)試的手機(jī)上,或者調(diào)試中不小心重啟App了,日志就沒(méi)了。
不多說(shuō)了,光這幾個(gè)問(wèn)題就夠我們有充分的理由去尋找一個(gè)新的Log系統(tǒng)了。先從最常用的下手,從網(wǎng)上能搜到最常用的Android logger有兩個(gè)。
- https://github.com/orhanobut/logger :簡(jiǎn)單、漂亮、強(qiáng)大的Android logger,github上3000+ Star
- https://github.com/JakeWharton/timber :基于Android原生Log的logger,小巧易擴(kuò)展。
看簡(jiǎn)介幫助不大,我們還是真刀真槍用一下,看看這兩個(gè)開源庫(kù)為什么這么受歡迎,有沒(méi)有解決我們的問(wèn)題。
好Logger應(yīng)該長(zhǎng)什么樣?
動(dòng)手分析之前,我們要先想想清楚,我們要的好Logger,應(yīng)該是什么樣的?
打印日志是一門傳統(tǒng)藝術(shù),歷史悠久,打從有編程那年就開始有了。它與單步調(diào)試并稱程序調(diào)試兩大神技,程序員們因?yàn)閾碜o(hù)不同的調(diào)試方法,分裂成了兩大陣營(yíng):日志派和調(diào)試派,兩派互相看不起。調(diào)試派說(shuō)打印日志太沒(méi)技術(shù)含量,還要到處做標(biāo)記,看我們調(diào)試派,想停哪里點(diǎn)哪里,想看什么看什么,調(diào)試器能帶我飛。日志派也不服氣,你能離線調(diào)試嗎?你能調(diào)試多線程錯(cuò)誤嗎?你能xxx調(diào)試嗎?
好程序員兩種技能都要掌握,現(xiàn)在調(diào)試工具越來(lái)越好用,單步調(diào)試沒(méi)有任何困難。但是打印日志仍然是不可或缺的必殺技,尤其是查活系統(tǒng)(運(yùn)行中軟件)的問(wèn)題時(shí),如果沒(méi)有后臺(tái)日志或者用戶手機(jī)日志,真是打死也不知道哪里出了問(wèn)題。
扯完日志的重要性,認(rèn)真說(shuō)說(shuō)我們對(duì)日志系統(tǒng)的需求:
- 容易打?。簾o(wú)論什么格式的數(shù)據(jù),上到自定義類,下到字節(jié)流,都能單行代碼給打出來(lái),不用為了打日志寫一堆額外的代碼邏輯。
- 格式漂亮:對(duì)格式化數(shù)據(jù)做打印美化,必要時(shí)適當(dāng)做點(diǎn)排版。
- 容易篩選:給日志分級(jí)和打標(biāo)簽,就是為了達(dá)到這個(gè)目的。
- 立即定位:每條日志都有兩個(gè)位置,代碼中的位置和運(yùn)行時(shí)位置(所在線程)。這兩個(gè)位置對(duì)快速定位問(wèn)題很重要。
- 靈活設(shè)置:日志數(shù)量和日志詳細(xì)程度是一對(duì)矛盾體。大多數(shù)情況下,普通的日志就夠我們分析問(wèn)題了。但是某些情況下,如多線程問(wèn)題,異步問(wèn)題,需要打印盡量詳細(xì)的信息,這個(gè)要能靈活設(shè)置。
- 日志留存:日志打到屏幕上,說(shuō)沒(méi)就沒(méi)。有沒(méi)有辦法屏幕上打一份,SD卡上存一份,崩潰信息網(wǎng)站上留一份?這有點(diǎn)類似linux上的tee命令。
- 容易上手:本來(lái)沒(méi)想寫這條,也沒(méi)想到上面會(huì)列出這么多特性,沒(méi)辦法,還是加上個(gè)容易上手的指標(biāo)吧。就是說(shuō)上邊這些特性,
能做到上面幾點(diǎn),我們就認(rèn)為這個(gè)日志系統(tǒng)非常好了。注意,我為什么沒(méi)提性能要求?因?yàn)檎桨l(fā)布版本里,是不會(huì)有日志的,起碼不會(huì)大量存在,所以性能也就無(wú)所謂了,別太差就行。尺子有了,我們就用它來(lái)衡量一下Timber和Logger。
Logger分析
這個(gè)項(xiàng)目在github上有3000+ star,必有過(guò)人之處。
- 容易打?。撼似胀ㄗ址秃兞孔址€能直接打印json、xml、異常,通過(guò)。
- 格式漂亮:的確漂亮,但是過(guò)分漂亮了。本來(lái)一行的日志給打成了8行,真超值。結(jié)果贈(zèng)品太多,都找不到我想看的那條了。
- 容易篩選:能分級(jí),能自動(dòng)打tag,能自定義tag。等等,為什么tag不是類名?難道用類名當(dāng)tag不是普世價(jià)值觀嗎?明白了,它的類名和方法名都在日志內(nèi)容中有了,tag中不用再放一個(gè)了。但是有Android Monitor依賴癥的我表示,這讓我怎么篩選一眼望不到頭的日志呀,差評(píng)。
- 立即定位:能跳轉(zhuǎn)到文件位置,能看函數(shù)名、線程號(hào),通過(guò)。
- 靈活設(shè)置:可以設(shè)置,但是設(shè)置項(xiàng)似乎不太豐富呀。
- 日志留存:不支持。
- 容易上手:一行代碼就能用,通過(guò)。
Timber分析
這個(gè)庫(kù)非常簡(jiǎn)潔,準(zhǔn)確講,它只有一個(gè)文件,是Jake Wharton大神自己用的。大神說(shuō)嫌拷貝來(lái)拷貝去太麻煩,才開源成一個(gè)庫(kù)。
- 容易打?。褐С制胀ㄗ址秃兞孔址?/li>
- 格式漂亮:不支持。
- 容易篩選:自動(dòng)用類名當(dāng)tag,也可以自定義。
- 立即定位:不支持。
- 靈活設(shè)置:支持,但沒(méi)什么設(shè)置項(xiàng)。
- 日志留存:支持。
- 容易上手:還是吐槽一下,這個(gè)庫(kù)的tree和plant是什么鬼?我是讀完它的代碼才明白的。其實(shí)跟樹、種樹、木頭沒(méi)一毛錢關(guān)系,大神只是借種樹這個(gè)形象的方法,說(shuō)日志可以寫到各種地方去。想寫哪里寫哪里,自己plant一個(gè)自己實(shí)現(xiàn)的Tree就可以了。不種樹就沒(méi)有日志。大神太幽默了。
總結(jié)
從總評(píng)價(jià)看,顯然Logger更好,特性更豐富。但是它的排版我實(shí)在接受不了。所以項(xiàng)目實(shí)踐中,我還是會(huì)用Timber。全劇終。
我去,這個(gè)結(jié)局太不能讓人滿意了,選了半天選了個(gè)不好用的,這世界怎么了?
改進(jìn)
權(quán)衡之下,還是改造一下Logger吧。在github上fork了Logger的代碼,針對(duì)Logger不滿的地方,加入我的改動(dòng)。為了保持Logger自身的特點(diǎn),新改動(dòng)通過(guò)Settings的形式加入,我給Settings加入mode設(shè)置。默認(rèn)是pretty模式,一切用法與輸出結(jié)果與原Logger保持一致,可以通過(guò)單元測(cè)試。如果對(duì)PRETTY模式下日志過(guò)多有意見,可以啟用brief模式,去除無(wú)用的分割線,把默認(rèn)日志從8行減為4行,保持可讀性和所有信息。如果還嫌多,可以啟動(dòng)single模式,默認(rèn)日志從8行壓縮到1行,保持必要信息。代碼庫(kù)見https://github.com/oreofish/logger
對(duì)這個(gè)改進(jìn)的版本重新評(píng)估如下:
- 容易打?。和?。
- 格式漂亮:可以方便的在8行的pretty模式,和4行的簡(jiǎn)潔模式,和1行的單行模式中切換。
- 容易篩選:能分級(jí),能自動(dòng)打tag,能自定義tag。單行模式下用Android Monitor過(guò)濾日志很方便。通過(guò)。
- 立即定位:同原作,而且重點(diǎn)保持了"能跳轉(zhuǎn)到文件位置"這個(gè)特性,通過(guò)。
- 靈活設(shè)置:可以設(shè)置。
- 日志留存:暫不支持(我很喜歡這個(gè)特性,有空要加上)。
- 容易上手:一行代碼就能用,通過(guò)。
- 彩蛋:寫代碼時(shí)經(jīng)常會(huì)加上一些臨時(shí)的日志,例如一大串相同的字符,只是為了在日志堆里容易看到。改進(jìn)版本中加入了預(yù)定義的表情字符串IAMHERE1到IAMHERE6,就是為了容易看到。
開源大法好。這,就是我想要的日志系統(tǒng)。我會(huì)嘗試提交代碼給Logger官方,雖然由于思路不同,他們可能不會(huì)合并我的代碼:)
結(jié)論
- 如果對(duì)日志要求不高,簡(jiǎn)單用用而已,Android自帶的Log就不錯(cuò)。
- 如果厭煩了Android Log,覺(jué)得用著不方便,Timber和Logger都是好選擇,Timber只要一個(gè)文件。
- 如果你覺(jué)得日志很重要,特別推薦的我的改進(jìn)版Logger。
- 還覺(jué)得不好?把你的需求說(shuō)出來(lái),或者自己動(dòng)手改進(jìn),都?xì)g迎。