接上一篇: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
也可關注“武散人”微信訂閱號,隨時接受文章推送,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/171917.html
標籤:Python
