使用Log的一些姿勢

2021-09-23 06:46:02 字數 2513 閱讀 1269

log 是任何一種程式語言的第乙個api,通常被初學者用來列印 hello, world!。 有研究顯示,

不使用 log 或者使用姿勢錯誤的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情需要書寫,不能是一整張白紙。

logcat是android開發者們最熟悉不過的日誌列印工具,幾乎每乙個android專案裡面都包含著大量的log相關**。不過,或許是因為log實在是太過於普通,所以許多人在使用它的時候就顯得非常隨意,這些錯誤的使用姿勢卻會在不經意間給我們帶來不少的大坑。

log相關的一些問題

沒有關閉除錯用的log

許多同學喜歡在開發階段用log輸出當前的一些環境資料,用於除錯**,但是在除錯完成後卻忘了關閉這些log,導致發版出去的應用裡面還會繼續輸出這些log,這樣不僅會造成不必要的效能丟失,也會暴露一些敏感的資料,這些都是我們不願看到的。

首先,我們要給log進行分級,規定「debug版本輸出哪一些級別的log並遮蔽哪一些級別的log,而release版本又輸出另一些級別的log並遮蔽另一些級別的log」,這樣在開發階段能夠輸出我們除錯需要的log,而同時又能保證放送的版本能夠遮蔽這些敏感的log。但是在開發階段我們不應該特意去注意這些細節,所以必須開發乙個log工具庫,在框架層級解決這個需求。

同時,需要注意的是,用於作為「開啟/關閉log」的開關必須是乙個常量,而不能是乙個變數(使用常量的話,在編譯**的時候,如果常量為false),編譯器會直接把除錯部分的log**直接去掉,而使用變數作為開關的話,這個判斷邏輯會繼續保留,一方面會造成效能丟失,另一方面在執行時也可以通過hack手段強行開啟這部分log**。

另外,「開啟/關閉log」的開關必須寫在log方法外部,也就是說必須先判斷「開啟/關閉log」條件,再呼叫log方法,因為在呼叫log方法的時候已經造成了效能丟失,而且呼叫方法的時候,會先構造好改方法需要的引數(按照引數順序從右往左),再呼叫方法,而許多人喜歡在呼叫log方法的時候計算需要列印出來的內容,這裡是最容易造成效能丟失的地方。因此,如果為了圖方便,寫乙個log工具類,在工具類內部去判斷是否應該開啟或關閉log,事實上已經造成了不少的效能丟失。正確的使用姿勢應該是:

public

static

final boolean debug = 

true

; if (debug)  

在迴圈體內部列印log

儘管log造成的效能損失很小,但是如果在迴圈體內部迴圈呼叫log方法的話,那總體的丟失的非常可觀了,所以不應該在迴圈體內部使用log,正確的做法是在迴圈體內部拼接需要列印的內容,等跳出迴圈體再一次列印出來。

除了常見的迴圈體外,還要乙個需要注意的場景就是adapter。listview/recyclerview是android開發中最常用的控制項,因此adapter使用的情景也很多。滾動螢幕的時候,listview/recyclerview會在通過adapter頻繁地繫結itemview和資料,而且這些都是在ui執行緒裡進行的,所以如果在繫結的過程中呼叫log,可能會造成明顯的卡頓。

至於log到底會丟失多少效能,一般情況下,log的效能丟失很小,畢竟是這麼常見的系統api,肯定是身經百戰,早就是「best performance」了。不過我曾經有個recyclerview在miui上非常卡,一開始我是recyclerview布局沒優化好,最終定位到adapter內部的一處log上,卡頓的地方出現在log的native實現。miui到底對使用者輸出的日誌做了什麼處理呢?非常神奇。

無法獲取重要log內容

在除錯**的時候,我們經常通過log來定位bug。同理,當線上的版本出現問題的時候,我們也希望能通過log來定位問題所在。但是問題是使用者的裝置上的列印出來的log我們根本沒有方法獲取,唯一的手段就是當使用者裝置出現問題的時候,把裝置借過來連上ide用logcat檢視輸出的log……顯然這是不可行的。

這種時候,我們可以在列印重要log(比如重要路徑的觸發點、或者一些異常類的資訊)的時候,一併把這些資訊記錄到檔案裡。在使用者反饋系統裡面,一併將這些檔案上傳到我們的使用者反饋伺服器,這樣在處理反饋問題的時候,就能拿到重要的參考日誌了。

blog

blog 是 android sdk 的 log 工具 的加強版,以方便在開發時用來

操作除錯日誌。

特點

簡單易用的api;

支援輸出執行緒資訊;

支援設定loglevel,方便在生產環境關閉除錯用的log;

支援將log內容寫入檔案,以便通過檔案log定位使用者反饋的問題;

注意,儘管blog支援關閉log的輸出,但是在你呼叫 blog.v(string) 的時候,其實已經造成了效能

丟失,所以請盡量使用正確的姿勢來使用blog,比如

if (buildconfig.debug)

關於log的一些指令碼

查詢日誌切換的頻率 最近7天 rac 和非rac通用 select a.thread b.recid,to char b.first time,yyyy mm dd hh mi ss start time,a.recid,to char a.first time,yyyy mm dd hh mi s...

關於Log 的一些介紹

1 log.v 的除錯顏色為黑色的,任何訊息都會輸出,這裡的v代表verbose囉嗦的意思,平時使用就是log.v 2 log.d的輸出顏色是藍色的,僅輸出debug除錯的意思,但他會輸出上層的資訊,過濾起來可以通過ddms的logcat標籤來選擇.3 log.i的輸出為綠色,一般提示性的訊息inf...

軟體打log的一些心得

本文適用範圍 linux系統 使用語言 c c 打log的原則 1.異常分支或錯誤處理一定要打log 2.重大操作時一定要打log,下面打log場景會講述 log格式的原則 1.時間戳必須有,最好能夠精確到微秒。精確到秒的時間戳,相信很多人都熟悉,這能夠確認問題的時間和系統uptime的對比,能夠進...