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