zoukankan      html  css  js  c++  java
  • 《自拍教程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
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    scala与java的区别
    寒假第四天
    冲刺(第六天)
    冲刺(第五天)
    冲刺(第四天)
    冲刺(第三天)
    冲刺(第二天)
    第十周总结
    冲刺(第一天)
    文本中单词统计
  • 原文地址:https://www.cnblogs.com/zipython/p/12520873.html
Copyright © 2011-2022 走看看