Android日志[进阶篇]一-使用 Logcat 写入和查看日志
Android日志[進階篇]一-使用 Logcat 寫入和查看日志
Android日志[進階篇]二-分析堆棧軌跡(調(diào)試和外部堆棧)
Android日志[進階篇]三-Logcat命令行工具
Android日志[進階篇]四-獲取錯誤報告
Android日志[進階篇]五-閱讀錯誤報告
目錄
- 查看應(yīng)用日志
- 寫入日志消息
- Logcat 消息格式
- 設(shè)置日志級別
- 搜索 logcat 消息
- 過濾 logcat 消息
- 讀取垃圾回收消息
- Dalvik 日志消息
- ART 日志消息
Android Studio 中的 Logcat 窗口會顯示系統(tǒng)消息,例如在進行垃圾回收時顯示的消息,以及使用 Log類添加到應(yīng)用的消息。此窗口可以實時顯示消息,也可以保留歷史記錄,因此可以查看較早的消息。
要僅顯示感興趣的信息,可以創(chuàng)建過濾器、修改消息中顯示的信息量、設(shè)置優(yōu)先級、僅顯示通過應(yīng)用代碼生成的消息以及搜索日志。默認情況下,logcat 僅顯示與最近運行的應(yīng)用相關(guān)的日志輸出。
如果應(yīng)用拋出異常,logcat 會顯示一條消息,后跟相關(guān)聯(lián)的堆棧軌跡,其中包含指向相應(yīng)代碼行的鏈接。
從 Android Studio 2.2 開始,Run 窗口還會顯示當前正在運行的應(yīng)用的日志消息。請注意,可以配置 logcat 輸出顯示,但無法配置 Run 窗口。
查看應(yīng)用日志
如需顯示應(yīng)用的日志消息,請執(zhí)行以下操作:
Logcat 窗口會顯示所選應(yīng)用(從窗口頂部的下拉列表中選擇)的日志消息,如圖 1 所示。
圖 1. Logcat 窗口
默認情況下,Logcat 僅顯示在設(shè)備上運行的應(yīng)用的日志消息。要更改此默認設(shè)置,請參閱如何過濾 logcat 消息。
Logcat 工具欄中提供的按鈕(如圖1標號):
寫入日志消息
通過 Log 類,可以創(chuàng)建(輸出)日志消息,這些消息會顯示在 logcat 中。一般來說,使用以下日志方法,這些方法按照優(yōu)先級從高到低(或者從最簡略到最詳細)的順序列示:
- Log.e(String, String)(錯誤)
- Log.w(String, String)(警告)
- Log.i(String, String)(信息)
- Log.d(String, String)(調(diào)試)
- Log.v(String, String)(詳細)
有關(guān)更完整的選項列表,請參閱 Log 類說明。
除開發(fā)期間外,其他任何時候都絕不應(yīng)將詳細日志編譯到您的應(yīng)用中。雖然會編譯調(diào)試日志,但會在運行時將其去掉,而錯誤、警告和信息日志會始終保留。
對于每種日志方法,第一個參數(shù)都應(yīng)是唯一標記,第二個參數(shù)都應(yīng)是消息。系統(tǒng)日志消息的標記是一個簡短的字符串,指示消息所源自的系統(tǒng)組件(例如 ActivityManager)。標記可以是有用的任何字符串,例如當前類的名稱。
一種比較好的做法是,在要用于第一個參數(shù)的類中聲明 TAG 常量。例如,可以按如下方式創(chuàng)建一條信息日志消息:
private static final String TAG = "MyActivity"; ... Log.i(TAG, "MyClass.getView() — get item number " + position);注意:長度超過 23 個字符的標記名稱在 logcat 輸出中會被截斷。
Logcat 消息格式
每個 Android 日志消息都有一個與之相關(guān)聯(lián)的標記和優(yōu)先級。系統(tǒng)日志消息的標記是一個簡短的字符串,指示消息所源自的系統(tǒng)組件(例如 ActivityManager)。用戶定義的標記可以是任何字符串,例如當前類的名稱(建議的標記)。可以在 Log 方法調(diào)用中定義它,例如:
Log.d(tag, message)優(yōu)先級低到高:
- V:詳細(優(yōu)先級最低)
- D:調(diào)試
- I:信息
- W:警告
- E:錯誤
- A:斷言
日志消息的格式為:
date time PID-TID/package priority/tag: message例如,下面的日志消息的優(yōu)先級為 V,標記為 Eagle:
12-10 13:02:50.071 1901-4229/com.eagle.app V/Eagle: Handling delegate intent.PID 代表進程標識符,TID 則為線程標識符;如果僅有一個線程,兩者可以相同。
設(shè)置日志級別
可以通過設(shè)置日志級別來控制 logcat 中顯示的消息數(shù)量。可以顯示所有消息,也可以僅顯示指示最嚴重情況的消息。
請注意,無論日志級別設(shè)置如何,logcat 都會繼續(xù)收集所有消息。此設(shè)置僅決定 logcat 顯示什么。
在“Log level”菜單中,選擇以下值之一:
- Verbose:顯示所有日志消息(默認值)。
- Debug:顯示僅在開發(fā)期間有用的調(diào)試日志消息,以及此列表中較低的消息級別。
- Info:顯示常規(guī)使用情況的預(yù)期日志消息,以及此列表中較低的消息級別。
- Warn:顯示尚不是錯誤的潛在問題,以及此列表中較低的消息級別。
- Error:顯示已經(jīng)引發(fā)錯誤的問題,以及此列表中較低的消息級別。
- Assert:顯示開發(fā)者預(yù)計絕不會發(fā)生的問題。
搜索 logcat 消息
要搜索 logcat 中當前顯示的消息,請執(zhí)行以下操作:
Logcat 輸出會相應(yīng)地顯示更改。
過濾 logcat 消息
將日志輸出減少至可管理水平的一種方法是,使用過濾器施加限制。
注意:過濾器會應(yīng)用于 logcat 的全部歷史記錄,而不僅僅是 logcat 中當前顯示的消息。確保適當?shù)卦O(shè)置其他顯示選項,以便能夠看到想要檢查的過濾器輸出。
要定義并應(yīng)用過濾器,請執(zhí)行以下操作:
- Show only selected application:僅顯示通過應(yīng)用代碼生成的消息(默認選項)。Logcat 使用正在運行的應(yīng)用的 PID 來過濾日志消息。
- No Filters:不應(yīng)用過濾器。無論選擇哪個進程,logcat 都會顯示設(shè)備中的所有日志消息。
- Edit Filter Configuration:創(chuàng)建或修改自定義過濾器。例如,創(chuàng)建一個過濾器,以同時查看兩個應(yīng)用中的日志消息。
- Filter Name:輸入要設(shè)定的過濾器的名稱,或者從左側(cè)窗格中進行選擇以修改現(xiàn)有過濾器。名稱只能包含小寫字符、下劃線和數(shù)字。
- Log Tag:(可選)指定標記。如需了解詳情,請參閱 Logcat 消息格式。
- Log Message:(可選)指定日志消息文本。如需了解詳情,請參閱 Logcat 消息格式。
- Package Name:(可選)指定軟件包名稱。如需了解詳情,請參閱 Logcat 消息格式。
- PID:(可選)指定進程 ID。如需了解詳情,請參閱 Logcat 消息格式>。
- Log Level:(可選)選擇日志級別。如需了解詳情,請參閱設(shè)置日志級別。
- Regex:選擇此選項可以為相應(yīng)參數(shù)使用正則表達式語法。
要移除過濾器,請在左側(cè)窗格中將其選中,然后點擊 -。
如果沒有看到想要檢查的日志消息,請嘗試選擇 No filters再clean一下日志, 并搜索特定日志消息。
讀取垃圾回收消息
有時,發(fā)生垃圾回收事件時,相應(yīng)消息會輸出到 Logcat 中。
如需詳細了解應(yīng)用的內(nèi)存,請使用內(nèi)存性能分析器。
Dalvik 日志消息
在 Dalvik(而不是 ART)中,每個 GC 都會將以下信息輸出到 logcat 中:
D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time示例:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms GC 原因在此類日志消息積聚時,請注意堆統(tǒng)計數(shù)據(jù)(上面示例中的 3571K/9991K 值)的增大情況。如果此值繼續(xù)增大,可能會出現(xiàn)內(nèi)存泄露。
ART 日志消息
與 Dalvik 不同,ART 不會為未明確請求的 GC 記錄消息。只有在系統(tǒng)認為 GC 速度較慢時才會輸出 GC 消息。更確切地說,僅在 GC 暫停時間超過 5 毫秒或 GC 持續(xù)時間超過 100 毫秒時。如果應(yīng)用未處于可察覺到暫停的狀態(tài)(例如應(yīng)用在后臺運行時,這種情況下,用戶無法察覺 GC 暫停),則其所有 GC 都不會被視為速度較慢。系統(tǒng)一直會記錄顯式 GC。
ART 會在其垃圾回收日志消息中包含以下信息:
I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects,Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)示例:
I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects,21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms GC 原因回收器轉(zhuǎn)換僅在以下情況下出現(xiàn):在 Android 8.0 之前的低內(nèi)存設(shè)備上,應(yīng)用將進程狀態(tài)從可察覺到暫停的狀態(tài)(例如應(yīng)用在前臺運行時,這種情況下,用戶可以察覺 GC 暫停)更改為察覺不到暫停的狀態(tài)(反之亦然)。
如果在 logcat 中看到大量 GC,請注意堆統(tǒng)計數(shù)據(jù)(上面示例中的 25MB/38MB 值)的增大情況。如果此值繼續(xù)增大,且始終沒有變小的趨勢,可能會出現(xiàn)內(nèi)存泄漏。或者,如果看到原因為“Alloc”的 GC,則您已快要達到堆容量上限,并且很快會出現(xiàn) OOM 異常。
總結(jié)
以上是生活随笔為你收集整理的Android日志[进阶篇]一-使用 Logcat 写入和查看日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis 基础——五大类型与数据结构
- 下一篇: 多台Linux服务器之间互相免密登陆