1. 程式人生 > 其它 >adb軟體自動化測試底層學習(4)---Log

adb軟體自動化測試底層學習(4)---Log

Android日誌記錄系統是系統程序logd維護的一組結構化環形緩衝區。這組快取是固定的,由系統定義(main,system,crash)

  • main : 儲存大多數應用日誌
  • system : 用於儲存源自Android作業系統訊息
  • crash : 用於儲存崩潰日誌
    每個日誌條目都包含一個優先順序(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一個標識日誌來源的標記以及實際的日誌訊息。

命令語法

[adb] logcat [<option>] [<filter-spec>]

同時也可以在shell環境下執行

$ adb shell 
# logcat [<option>] [<filter-spec>]

常用選項(option)

選項 說明
-b <buffer> 載入可供檢視的備用日誌緩衝區,例如 events 或 radio。預設使用 main、system 和 crash 緩衝區集
-c 清除(清空)所選的緩衝區並退出。預設緩衝區集為 main、system 和 crash。如需清除所有緩衝區,請使用 -b all -c。
-e <expr> 只輸出日誌訊息與 <expr> 匹配的行,其中 是正則表示式。
-m<count> 輸出 <count> 行後退出。這樣是為了與 --regex 配對,但可以獨立執行。
-d 將日誌轉儲到螢幕並退出。
-v <format> 置日誌訊息的輸出格式。預設格式為 threadtime。 檢視日誌輸出格式
--pid 僅輸出來自給定 PID 的日誌。

檢視備用日誌緩衝區

Android 日誌記錄系統為日誌訊息保留了多個環形緩衝區,而且並非所有的日誌訊息都會發送到預設的環形緩衝區。如要檢視其他日誌訊息,您可以使用 -b 選項執行 logcat 命令,以請求檢視備用的環形緩衝區。您可以檢視下列任意備用緩衝區:

  • radio:檢視包含無線裝置/電話相關訊息的緩衝區。
  • events:檢視已經過解譯的二進位制系統事件緩衝區訊息。
  • main:檢視主日誌緩衝區(預設),不包含系統和崩潰日誌訊息。
  • system:檢視系統日誌緩衝區(預設)。
  • crash:檢視崩潰日誌緩衝區(預設)。
  • all:檢視所有緩衝區。
  • default:報告 main、system 和 crash 緩衝區
adb logcat -b radio //指定radio
adb logcat -b main,radio,system //指定main,radio,system
adb logcat -b main -b radio -b system //指定main,radio,system

檢視日誌輸出格式

除標記和優先順序外,日誌訊息還包含許多元資料欄位。您可以修改訊息的輸出格式,以便它們顯示特定的元資料欄位。為此,您可以使用 -v 選項,並指定下列某一受支援的輸出格式。

  • brief:顯示優先順序、標記以及發出訊息的程序的 PID。
  • long:顯示所有元資料欄位,並使用空白行分隔訊息。
  • process:僅顯示 PID。
  • raw:顯示不包含其他元資料欄位的原始日誌訊息。
  • tag:僅顯示優先順序和標記。
  • thread::舊版格式,顯示優先順序、PID 以及發出訊息的執行緒的 TID。
  • threadtime(預設值):顯示日期、呼叫時間、優先順序、標記、PID 以及發出訊息的執行緒的 TID。
  • time:顯示日期、呼叫時間、優先順序、標記以及發出訊息的程序的 PID。

adb logcat -v brief//顯示優先順序標記&pid

過濾日誌輸出

  • 日誌訊息的標記(tag)是一個簡短的字串,指示訊息所源自的系統元件(例如,“View”表示檢視系統)。
  • 優先順序(priority)是以下字元值之一(按照從最低到最高優先順序的順序排列):
    • V:詳細(最低優先順序)
    • D:除錯
    • I:資訊
    • W:警告
    • E:錯誤
    • F:嚴重錯誤
    • S:靜默(最高優先順序,絕不會輸出任何內容)

通過執行 Logcat 並觀察每條訊息的前兩列,可以獲取系統中使用的帶有優先順序的標記列表,格式為<priority>/<tag>。

$ adb logcat -v brief --pid 707
$ I/tify.tv.androi(  707): Background concurrent copying GC freed 6351(355KB) AllocSpace objects, 14(280KB) LOS objects, 24% free, 2766KB/3688KB, paused 608us total 189.894ms

如要將日誌輸出降低到可管理的水平,您可以使用過濾器表示式限制日誌輸出。通過過濾器表示式,您可以向系統指明您感興趣的標記/優先順序組合,系統會針對指定的標記抑制其他訊息。

過濾器表示式採用 tag:priority ... 格式,其中 tag 指示您感興趣的標記,priority 指示可針對該標記報告的最低優先順序。不低於指定優先順序的標記的訊息會寫入日誌。您可以在一個過濾器表示式中提供任意數量的 tag:priority 規範。一系列規範使用空格分隔。

以下是一個過濾器表示式的示例,該表示式會抑制除標記為“ActivityManager”、優先順序不低於“資訊”的日誌訊息,以及標記為“MyApp”、優先順序不低於“除錯”的日誌訊息以外的所有其他日誌訊息:

adb logcat -v brief ActivityManager:I MyApp:D *:S
上述表示式中最後一個元素 *:S 將所有標記的優先順序設為“靜默”,從而確保系統僅顯示標記為“ActivityManager”和“MyApp”的日誌訊息。使用 *:S 是確保日誌輸出受限於您已明確指定的過濾器的絕佳方式,它可以讓過濾器充當日誌輸出的“許可名單”。