Logcat 是一個命令行工具,用於轉儲系統消息日誌,包括設備拋出錯誤時的堆棧軌跡,以及從您的應用中使用 Log
類寫入的消息。
本頁面介紹了命令行 Logcat 工具,但在 Android Studio 中,您也可以從 Logcat 窗口查看日誌消息。要了解如何在 Android Studio 中查看和過濾日誌,請參閱使用 Logcat 寫入和查看日誌。
命令行語法
要通過 adb shell 運行 Logcat,一般用法如下:
[adb] logcat [<option>] ... [<filter-spec>] ...
要獲取 logcat
在線幫助,請啓動設備,然後執行以下命令:
adb logcat --help
您可以建立與設備的 shell 連接並執行以下命令:
$ adb shell
# logcat
選項
下表介紹了 logcat
的命令行選項。
選項 | 說明 |
---|---|
-b <buffer> |
加載可供查看的備用日誌緩衝區,例如 events 或 radio 。默認使用 main 、system 和 crash 緩衝區集。請參閱查看備用日誌緩衝區。 |
-c, --clear |
清除(清空)所選的緩衝區並退出。默認緩衝區集爲 main 、system 和 crash 。要清除所有緩衝區,請使用 -b all -c 。 |
-e <expr>, --regex=<expr> |
只輸出日誌消息與 <expr> 匹配的行,其中 <expr> 是一個正則表達式。 |
|
輸出 <count> 行後退出。這樣是爲了與 --regex 配對,但可以獨立運行。 |
--print |
與 --regex 和 --max-count 配對,使內容繞過正則表達式過濾器,但仍能夠在獲得適當數量的匹配時停止。 |
-d |
將日誌轉儲到屏幕並退出。 |
-f <filename> |
將日誌消息輸出寫入 <filename> 。默認值爲 stdout 。 |
-g, --buffer-size |
輸出指定日誌緩衝區的大小並退出。 |
-n <count> |
將輪替日誌的數量上限設置爲 <count> 。默認值爲 4。需要使用 -r 選項。 |
-r <kbytes> |
每輸出 <kbytes> 時輪替日誌文件。默認值爲 16。需要使用 -f 選項。 |
-s |
相當於過濾器表達式 '*:S' ;它將所有標記的優先級設爲“靜默”,並用於放在可添加內容的過濾器表達式列表之前。要了解詳情,請轉到有關過濾日誌輸出的部分。 |
-v <format> |
設置日誌消息的輸出格式。默認格式爲 threadtime 。有關支持的格式列表,請參閱介紹控制日誌輸出格式的部分。 |
-D, --dividers |
輸出各個日誌緩衝區之間的分隔線。 |
-c |
清空(清除)整個日誌並退出。 |
-t <count> |
僅輸出最新的行數。此選項包括 -d 功能。 |
-t '<time>' |
輸出自指定時間以來的最新行。此選項包括
|
-T <count> |
輸出自指定時間以來的最新行數。此選項不包括 -d 功能。 |
-T '<time>' |
輸出自指定時間以來的最新行。此選項不包括
|
-L, -last |
在最後一次重新啓動之前轉儲日誌。 |
-B, --binary |
以二進制文件形式輸出日誌。 |
-S, --statistics |
在輸出中包含統計信息,以幫助您識別和定位日誌垃圾信息發送者。 |
-G <size> |
設置日誌環形緩衝區的大小。可以在結尾處添加 K 或 M ,以指示單位爲千字節或兆字節。 |
-p, --prune |
輸出(讀取)當前的白名單和黑名單,不採用任何參數,如下所示:
|
-P '<list> ...' |
寫入(設置)白名單和黑名單,以出於特定目的調整日誌記錄內容。您可以提供
默認情況下,日誌記錄系統會自動以動態方式將日誌統計信息中最嚴重的違規內容列入黑名單,以便爲新的日誌消息騰出空間。一旦它用盡啓發法,系統便會刪除最舊的條目,以便爲新消息騰出空間。 添加白名單可保護您的 Android 識別碼 (AID),它會變成進程的 AID 和 GID,而不會被聲明爲違規內容;添加黑名單有助於在相應內容被視爲最嚴重的違規內容之前即釋放空間。 您可以選擇刪除內容的程度和頻率;也可以關閉刪除功能,這樣,系統便僅會移除各個日誌緩衝區中最舊條目的內容。 引號
以下示例指定了一個包含 PID 32676 和 UID 675 的白名單和一個包含 PID 32677 和 UID 897 的黑名單。黑名單中的 PID 32677 經過加權處理,以便可以更快刪除。
其他您可以使用的黑名單和白名單命令變體如下所示:
|
--pid=<pid> ... |
僅輸出來自給定 PID 的日誌。 |
--wrap |
休眠 2 小時或者當緩衝區即將封裝時(兩者取其先)。通過提供即將封裝喚醒來提高輪詢的效率。 |
過濾日誌輸出
- 日誌消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如,“View”表示視圖系統)。
- 優先級是以下字符值之一(按照從最低到最高優先級的順序排列):
-
V
:詳細(最低優先級)D
:調試I
:信息W
:警告E
:錯誤F
:嚴重錯誤S
:靜默(最高優先級,絕不會輸出任何內容)
通過運行 Logcat 並觀察每條消息的前兩列,您可以獲取系統中使用的帶有優先級的標記列表,格式爲 <priority>/<tag>
。
以下是使用 logcat -v brief output
命令獲取的簡短 Logcat 輸出的示例。它表明消息與優先級“I”和標記“ActivityManager”相關:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
要將日誌輸出降低到可管理的水平,您可以使用過濾器表達式限制日誌輸出。通過過濾器表達式,您可以向系統指明您感興趣的標記/優先級組合,系統會針對指定的標記抑制其他消息。
過濾器表達式採用 tag:priority ...
格式,其中 tag
指示您感興趣的標記,priority
指示可針對該標記報告的最低優先級。不低於指定優先級的標記的消息會寫入日誌。您可以在一個過濾器表達式中提供任意數量的 tag:priority
規範。一系列規範使用空格分隔。
以下是一個過濾器表達式的示例,該表達式會抑制除標記爲“ActivityManager”、優先級不低於“信息”的日誌消息,以及標記爲“MyApp”、優先級不低於“調試”的日誌消息以外的所有其他日誌消息。
adb logcat ActivityManager:I MyApp:D *:S
上述表達式中最後一個元素 *:S
將所有標記的優先級設爲“靜默”,從而確保系統僅顯示標記爲“ActivityManager”和“MyApp”的日誌消息。使用 *:S
是確保日誌輸出受限於您已明確指定的過濾器的絕佳方式,它可以讓過濾器充當日誌輸出的“白名單”。
以下過濾器表達式顯示了優先級不低於“警告”的所有標記的所有日誌消息:
adb logcat *:W
如果您從開發計算機運行 Logcat(相對於在遠程 adb shell 上運行),則也可以通過導出環境變量 ANDROID_LOG_TAGS
的值設置默認過濾器表達式:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
請注意,如果您從遠程 shell 或使用 adb shell logcat
運行 Logcat,則系統不會將 ANDROID_LOG_TAGS
過濾器導出到模擬器/設備實例。
控制日誌輸出格式
除標記和優先級外,日誌消息還包含許多元數據字段。您可以修改消息的輸出格式,以便它們顯示特定的元數據字段。爲此,您可以使用 -v
選項,並指定下列某一受支持的輸出格式。
brief
:顯示優先級、標記以及發出消息的進程的 PID。long
:顯示所有元數據字段,並使用空白行分隔消息。process
:僅顯示 PID。raw
:顯示不包含其他元數據字段的原始日誌消息。tag
:僅顯示優先級和標記。thread:
:舊版格式,顯示優先級、PID 以及發出消息的線程的 TID。threadtime
(默認值):顯示日期、調用時間、優先級、標記、PID 以及發出消息的線程的 TID。time
:顯示日期、調用時間、優先級、標記以及發出消息的進程的 PID。
啓動 Logcat 時,您可以使用 -v
選項指定所需的輸出格式:
[adb] logcat [-v <format>]
以下示例顯示瞭如何生成輸出格式爲 thread
的消息:
adb logcat -v thread
請注意,您只能使用 -v
選項指定一種輸出格式,但可以指定任意數量的有意義的修飾符。Logcat 會忽略沒有意義的修飾符。
格式修飾符
格式修飾符依據以下一個或多個修飾符的任意組合更改 Logcat 輸出。要指定格式修飾符,請使用 -v
選項,如下所示:
adb logcat -b all -v color -d
每個 Android 日誌消息都有一個與之相關聯的標記和優先級。 您可以將任何格式修飾符與以下任一格式選項進行組合:brief
、long
、process
、raw
、tag
、thread
、threadtime
和 time
。
您可以通過在命令行中輸入 logcat -v --help
獲取格式修飾符詳細信息。
color
:使用不同的顏色來顯示每個優先級。descriptive
:顯示日誌緩衝區事件說明。此修飾符僅影響事件日誌緩衝區消息,不會對其他非二進制文件緩衝區產生任何影響。事件說明取自 event-log-tags 數據庫。epoch
:顯示自 1970 年 1 月 1 日以來的時間(以秒爲單位)。monotonic
:顯示自上次啓動以來的時間(以 CPU 秒爲單位)。printable
:確保所有二進制日誌記錄內容都進行了轉義。uid
:如果訪問控制允許,則顯示 UID 或記錄的進程的 Android ID。usec
:顯示精確到微秒的時間。UTC
:顯示 UTC 時間。year
:將年份添加到顯示的時間。zone
:將本地時區添加到顯示的時間。
查看備用日誌緩衝區
Android 日誌記錄系統爲日誌消息保留了多個環形緩衝區,而且並非所有的日誌消息都會發送到默認的環形緩衝區。要查看其他日誌消息,您可以使用 -b
選項運行 logcat
命令,以請求查看備用的環形緩衝區。您可以查看下列任意備用緩衝區:
radio
:查看包含無線裝置/電話相關消息的緩衝區。events
:查看已經過解譯的二進制系統事件緩衝區消息。main
:查看主日誌緩衝區(默認),不包含系統和崩潰日誌消息。system
:查看系統日誌緩衝區(默認)。crash
:查看崩潰日誌緩衝區(默認)。all
:查看所有緩衝區。default
:報告main
、system
和crash
緩衝區。
以下是 -b
選項的用法:
[adb] logcat [-b <buffer>]
以下示例顯示瞭如何查看包含無線裝置和電話相關消息的日誌緩衝區。
adb logcat -b radio
此外,您也可以爲要輸出的所有緩衝區指定多個 -b
標記,如下所示:
logcat -b main -b radio -b events
您可以指定一個 -b
標記,後跟緩衝區逗號分隔列表,例如:
logcat -b main,radio,events
通過代碼記錄日誌
通過 Log
類,您可以在代碼中創建日誌條目,而這些條目會顯示在 Logcat 工具中。常用的日誌記錄方法包括:
Log.v(String, String)
(詳細)Log.d(String, String)
(調試)Log.i(String, String)
(信息)Log.w(String, String)
(警告)Log.e(String, String)
(錯誤)
例如,使用以下調用:
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Logcat 輸出類似如下:
I/MyActivity( 1557): MyClass.getView() — get item number 1