Shell指令碼 | 抓取log檔案

Shengjie發表於2019-02-22

在安卓應用的測試過程中,遇到 Crash 或者 ANR 後,想必大家都會通過 adb logcat 命令來抓取日誌定位問題。如果直接使用 logcat 命令的話,預設抓取出的 log 檔案包含安卓執行時產生的所有日誌,給快速定位問題增加了時間成本。

這個問題可以通過一個簡單的 Shell 指令碼來解決,依然只有區區 20 行左右的程式碼。

指令碼的編寫思路是這樣的:
1、通過 date 命令獲取當前時間並賦值給變數 "DATE",格式為 "year/month/day/hour/minutes/second"。這個時間戳可以用來給輸出的 log 檔案命名,每次執行指令碼都是不同的時間點,從而達到區分 log 檔案的目的;
2、通過 read 命令讀取包名;
3、通過 read 命令讀取日誌的優先順序(V/D/I/W/E/F/S),通常,我們需要的是 E(Error)級別的日誌,也就是應用執行時產生的錯誤資訊;
4、執行 adb logcat 命令,將第 3 步中的優先順序(priority)作為輸入引數來過濾日誌,縮小輸出日誌的大小和範圍;
5、執行 adb logcat 命令,不新增篩選條件,輸出全部日誌以防萬一(參考第 7 步);
6、Crash 的資訊存在於 log 檔案中,而 ANR 的問題則需要 traces 檔案。通過 adb pull 命令可將手機中的 /data/anr/traces.txt 檔案取出;
7、執行 adb logcat -c 命令。每次獲取 log 檔案後,清空日誌,保持測試機日誌環境的乾淨,方便下次遇到問題後的日誌獲取和問題定位。

以下為編寫好的指令碼:

#!/bin/bash
DATE=$(date "+%Y%m%d%H%M%S")
# 讀取包名
echo -n "Please enter the package name:"
read package_name
# 日誌級別:V/D/I/W/E/F/S
echo -n "Please enter the priority of log:"
read priority
# log命令
adb logcat -d -v long "AndroidRuntime:${priority}" "*:S" > ~/Desktop/logg/${package_name}${DATE}.log
adb logcat -d -v threadtime > ~/Desktop/logg/${package_name}${DATE}_all.log
# anr日誌
adb pull /data/anr/traces.txt ~/Desktop/logg/
# 清空日誌
adb logcat -c

執行示例:

-> ./grab_log.sh 
Please enter the package name:com.baidu.minivideo
Please enter the priority of log:E
/data/anr/traces.txt: 1 file pulled.

歡迎關注微信公眾號“測試開發Stack”,更多原創文章第一時間釋出!

相關文章