接上一篇: "adb命令_一鍵截取logcat日誌" , 有一天, 系統穩定性開發負責人找到我,希望我能在跑android 系統monkey的時候, 實時監控logcat的輸出,如果一旦發現“java.lang.NullPointerException"空指針異常, 則立刻用adb bugrepor ...
接上一篇:adb命令_一鍵截取logcat日誌,
有一天, 系統穩定性開發負責人找到我,希望我能在跑android 系統monkey的時候,
實時監控logcat的輸出,如果一旦發現“java.lang.NullPointerException"空指針異常,
則立刻用adb bugreport命令導出當時log壓縮包出來。
準備階段
- adb logcat -v threadtime > D:\logcat_20200310_101112.txt可以列印按線程時間log並保存到一個文件。
- 由於adb logcat命令是一個持續輸出的命令,它如果沒被銷毀(殺進程),會一直持續截取下去。
- subprocess.Popen()類是支持通過stdout=subprocess.PIPE來持續獲取輸出的並按行讀取。
- adb bugreport只是一個命令,可以打包當時的tombstone, getprop, proc,cache等信息。
Python批處理腳本形式
# coding=utf-8
import os
import re
import subprocess
command = "adb logcat -v threadtime" # 具體命令
keyword_reg = r".*java.lang.NullPointerException.*" # 正則表達式
# 開始執行adb命令
p_obj = subprocess.Popen(
args=command,
stdin=None, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
# 實時監控並過濾每一行生成的日誌里的關鍵字
print("Logcat catching and filtering...")
with p_obj:
for line in p_obj.stdout:
if re.match(keyword_reg, line.decode("utf-8")):
print("Found %s" % keyword_reg)
print("running adb bugreport to pull releated logs...pls wait")
os.system("adb bugreport") # 導出一次bugreport log壓縮包
os.system("pause")
re模塊的匹配,查找,替換等各種操作,都只能對字元串操作。
p_obj.stdout輸出的是bytes,所以需要進行utf-8解碼後才能變成字元串。
Python面向過程函數形式
# coding=utf-8
import os
import re
import subprocess
command = "adb logcat -v threadtime" # 具體命令
keyword_reg = r".*java.lang.NullPointerException.*" # 正則表達式
def filter_logcat():
# 開始執行adb命令
p_obj = subprocess.Popen(
args=command,
stdin=None, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
# 實時監控並過濾每一行生成的日誌里的關鍵字
print("Logcat catching and filtering...")
with p_obj:
for line in p_obj.stdout:
if re.match(keyword_reg, line.decode("utf-8")):
print("Found %s" % keyword_reg)
print("running adb bugreport to pull releated logs...pls wait")
os.system("adb bugreport") # 導出一次bugreport log壓縮包
filter_logcat()
os.system("pause")
Python面向對象形式
# coding=utf-8
import os
import re
import subprocess
command = "adb logcat -v threadtime" # 具體命令
keyword_reg = r".*java.lang.NullPointerException.*" # 正則表達式
class LogcatFilter(object):
def __init__(self):
# 開始執行adb命令
self.p_obj = subprocess.Popen(
args=command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
def filter_logcat(self):
# 實時監控並過濾每一行生成的日誌里的關鍵字
print("Logcat catching and filtering...")
with self.p_obj:
for line in self.p_obj.stdout:
if re.match(keyword_reg, line.decode("utf-8")):
print("Found %s" % keyword_reg)
print("running adb bugreport to pull releated logs...pls wait")
os.system("adb bugreport") # 導出一次bugreport log壓縮包
if __name__ == '__main__':
l_obj = LogcatFilter()
l_obj.filter_logcat()
os.system("pause")
代碼運行方式及效果
確保Android車機設備通過USB線與電腦連接了,adb設備有效連接,
以上代碼的3種實現形式都可以直接運行,比如保存為filter_logcat.py並放在桌面,
建議python filter_logcat.py運行,當然也可以雙擊運行, 效果如下:
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=389e4bab6097442a8e72e063a0eafa97
也可關註“武散人”微信訂閱號,隨時接受文章推送。