Android日志[进阶篇]三-Logcat 命令行工具
Android日志[進階篇]一-使用 Logcat 寫入和查看日志
Android日志[進階篇]二-分析堆棧軌跡(調試和外部堆棧)
Android日志[進階篇]三-Logcat命令行工具
Android日志[進階篇]四-獲取錯誤報告
Android日志[進階篇]五-閱讀錯誤報告
目錄
- 日志記錄系統概覽
- 命令行語法
- logcat命令行選項
- 過濾日志輸出
- 控制日志輸出格式
- 格式修飾符
- 查看備用日志緩沖區
- 通過代碼記錄日志
前言:平常用logcat看日志或copy日志,實際是在logcat的一個可視化窗口上進行簡單的read和copy,這個窗口是由logcat工具支撐的,并不是logcat的全部。
Logcat 是一個命令行工具,用于轉儲系統消息日志,包括設備拋出錯誤時的堆棧軌跡,以及App使用 Log 類寫入的消息。
本文介紹了命令行 Logcat 工具,但在 Android Studio 中,可以從 Logcat 窗口查看日志消息。如需了解如何在 Android Studio 中查看和過濾日志,請參閱Android日志[進階篇]一-使用 Logcat 寫入和查看日志。
日志記錄系統概覽
Android 日志記錄系統是系統進程 logd 維護的一組結構化環形緩沖區。這組可用的緩沖區是固定的,并由系統定義。最相關的緩沖區為:main(用于存儲大多數應用日志)、system(用于存儲源自 Android 操作系統的消息)和 crash(用于存儲崩潰日志)。每個日志條目都包含一個優先級(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一個標識日志來源的標記以及實際的日志消息。
日志記錄系統的主接口是共享庫 liblog 及其頭文件 <android/log.h>。所有語言特定的日志記錄工具最終都會調用函數 __android_log_write。默認情況下,它會調用函數 __android_log_logd_logger,該函數使用套接字將日志條目發送到 logd。從 API 級別 30 開始,可通過調用 __android_set_log_writer 更改日志記錄函數。如需了解詳情,請參閱 NDK 文檔。
運行 adb logcat 顯示的日志要經過四個級別的過濾:
- log.tag.MyApp
- persist.log.tag.MyApp
- log.tag
- persist.log.tag
命令行語法
如需通過 adb shell 運行 Logcat,一般用法如下:
[adb] logcat [<option>] … [<filter-spec>] …
可以將 logcat 作為 adb 命令運行,也可以直接在模擬器或關聯設備的 shell 提示中運行。如需使用 adb 查看日志輸出,請轉到SDK platform-tools/(配置了環境變量的話,可以直接打開命令行窗口即可運行) 目錄并執行以下命令:
adb logcat如需獲取 logcat 在線幫助,請啟動設備,然后執行以下命令:
adb logcat --help可以建立與設備的 shell 連接并執行以下命令:
$ adb shelllogcat命令行選項
下表介紹了 logcat 的命令行選項。
| -b?<buffer> | 加載可供查看的備用日志緩沖區,例如 events 或 radio。默認使用 main、system 和 crash 緩沖區集。請參閱查看備用日志緩沖區。 |
| -c, --clear | 清除(清空)所選的緩沖區并退出。默認緩沖區集為 main、system 和 crash。如需清除所有緩沖區,請使用 -b all -c。 |
| -e <expr>, --regex=<expr> | 只輸出日志消息與 <expr> 匹配的行,其中 <expr> 是正則表達式。 |
| -m <count>, --max-count=<count> | 輸出 <count> 行后退出。這樣是為了與 --regex 配對,但可以獨立運行。 |
| 與 --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>' | 輸出自指定時間以來的最新行。此選項包括 -d 功能。如需了解如何引用帶有嵌入空格的參數,請參閱 -P 選項。 adb logcat -t '01-26 20:52:41.820' |
| -T <count> | 輸出自指定時間以來的最新行數。此選項不包括 -d 功能。 |
| -T '<time>' | 輸出自指定時間以來的最新行。此選項不包括 -d 功能。如需了解如何引用帶有嵌入空格的參數,請參閱 -P 選項。 adb logcat -t '01-26 20:52:41.820' |
| -L, --last | 在最后一次重新啟動之前轉儲日志。 |
| -B, --binary | 以二進制文件形式輸出日志。 |
| -S, --statistics | 在輸出中包含統計信息,以幫助您識別和定位日志垃圾信息發送者。 |
| -G <size> | 設置日志環形緩沖區的大小。可以在結尾處添加 K 或 M,以指示單位為千字節或兆字節。 |
| -p, --prune | 輸出(讀取)當前的允許 (white) 列表和拒絕 (black) 列表,不采用任何參數,如下所示: adb logcat -p |
| -P '<list> ...' --prune '<list> ...' -P '<white_and_black_list>' | 寫入(設置)允許 (white) 列表和拒絕 (black) 列表以出于特定目的調整日志記錄內容。您可以提供允許 (<white>) 列表和拒絕 (~<black>) 列表條目的混合內容,其中 <white> 或 <black> 可以是 UID、UID/PID 或 /PID。在 logcat 統計信息 (logcat -S) 的指導下,您可以考慮出于各種目的調整允許 (white) 列表和拒絕 (black) 列表,例如:
默認情況下,日志記錄系統會自動以動態方式阻止日志統計信息中最嚴重的違規內容,以便為新的日志消息騰出空間。一旦它用盡啟發法,系統便會刪除最舊的條目,以便為新消息騰出空間。 添加許可名單 (whitelist) 可保護您的 Android 識別碼 (AID),它會變成進程的 AID 和 GID,而不會被聲明為違規內容;添加拒絕列表有助于在相應內容被視為最嚴重的違規內容之前即釋放空間。您可以選擇刪除內容的程度和頻率;也可以關閉刪除功能,這樣,系統便僅會移除各個日志緩沖區中最舊條目的內容。 引號 adb logcat 不會保留引號,因此指定允許 (white) 列表和拒絕 (black) 列表的語法如下所示: $ adb logcat -P '"<white_and_blacklist>"' or adb shell $ logcat -P '<white_and_blacklist>'以下示例指定了一個包含 PID 32676 和 UID 675 的允許 (white) 列表,以及一個包含 PID 32677 和 UID 897 的拒絕 (black) 列表。拒絕列表中的 PID 32677 經過加權處理,以便可以更快刪除。 adb logcat -P '"/32676 675 ~/32677 897"'其他您可以使用的允許 (white) 列表和拒絕 (black) 列表命令變體如下所示: ~! worst uid blacklist ~1000/! worst pid in system (1000) |
| --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總結
以上是生活随笔為你收集整理的Android日志[进阶篇]三-Logcat 命令行工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 高级 —— 索引实现的思考
- 下一篇: 实施文档_建设工程监理全套资料范本,Wo