当前位置: 移动技术网 > IT编程>脚本编程>Python > 《自拍教程45》Python_adb实时监控Logcat日志

《自拍教程45》Python_adb实时监控Logcat日志

2020年03月19日  | 移动技术网IT编程  | 我要评论

顶尖高手坛,午夜编年史,维生素b1的作用

接上一篇:,
有一天, 系统稳定性开发负责人找到我,希望我能在跑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运行,当然也可以双击运行, 效果如下:


更多更好的原创文章,请访问官方网站:
自拍教程(自动化测试python教程,武散人编著)
原文链接:
也可关注“武散人”微信订阅号,随时接受文章推送。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网