《自拍教程45》Python adb實時監控Logcat日志


接上一篇:adb命令_一鍵截取logcat日志
有一天, 系統穩定性開發負責人找到我,希望我能在跑android 系統monkey的時候,
實時監控logcat的輸出,如果一旦發現“java.lang.NullPointerException"空指針異常,
則立刻用adb bugreport命令導出當時log壓縮包出來。


准備階段
  1. adb logcat -v threadtime > D:\logcat_20200310_101112.txt可以打印按線程時間log並保存到一個文件。
  2. 由於adb logcat命令是一個持續輸出的命令,它如果沒被銷毀(殺進程),會一直持續截取下去。
  3. subprocess.Popen()類是支持通過stdout=subprocess.PIPE來持續獲取輸出的並按行讀取。
  4. 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
也可關注“武散人”微信訂閱號,隨時接受文章推送。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM