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

摘要:
Python批处理脚本表单#coding=utf-8importosimportReimportSubprocesscommand=“adblogcat vthreadtime”#特定命令关键字_ Reg=r“.*java.lang.NullPointerException.*”#正则表达式#开始执行adb命令p_obj=subprocess.Popen(args=命令,

接上一篇: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运行,当然也可以双击运行, 效果如下:
《自拍教程45》Python adb实时监控Logcat日志第1张

更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=389e4bab6097442a8e72e063a0eafa97
也可关注“武散人”微信订阅号,随时接受文章推送。
《自拍教程45》Python adb实时监控Logcat日志第2张

免责声明:文章转载自《《自拍教程45》Python adb实时监控Logcat日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇raid0,raid1,raid10,raid5,raid50,raid6,raid60的功能总结简述Android刷机教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

KVM基本功能管理

 一、KVM基础功能管理 1、查看命令帮助 virsh -h 2、查看 KVM 的配置文件存放目录(CENTOS7.0.xml是虚拟系统实例的配置文件) ls /etc/libvirt/qemu                 //属性配置文件路径 ls /virtual/KVM/                     //虚拟机磁盘镜像文件路径 3、查...

android logd 原理及实现

一、logd介绍 logd 是Android L版本提出来的概念,其作用是保存Android运行期间的log(日志)。在Android L之前,log由kernel的ring buffer 保存,在Android L之后,log保存在用户空间。 1)  logd进程启动 系统启动到init函数时会解析init.rc文件,启动logd进程和logd-rein...

案例:Redis在京东的使用技术模型图

  http://www.100ec.cn  2013年09月27日17:30  中国电子商务研究中心 我要投稿 产品服务     (中国电子商务研究中心讯)Redis是一个开源的,遵守BSD许可协议的key/value缓存系统,并由其高效的响应速度以及丰富的数据结构而闻名。Redis在京东的使用也是非常普遍的,包括很多关键业务上的使用,由于Redis...

跟我一起写 Makefile

转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Makefile 总述 5. 书写命令 6. 使用变量 7. 使用条件判断 8. 使用函数 9. make 的运行 10. 隐含规则 11. 使用make更新函数库文...

如何在linux下安装idea

【通过官方安装包安装】 在 http://www.jetbrains.com/ 官网下载对应版本。 ultimate 旗舰版 community 社区版 然后解压到本地对应目录,打开idea目录下的bin目录,执行./idea.sh命令即可打开。     但是这种方式没法将idea加入到启动器中,推荐以下两种方式,安装后可以在...

linux查看端口占用

今天发现服务器上mysql 3306端口起不来,老提示端口已经被占用。 使用命令: ps -aux | grep mysql 发现并没有3306端口的mysql进程。 使用命令:netstat –anp 查看所有的进程和端口使用情况。发现下面的进程列表,其中最后一栏是PID/Program name  假设我们发现3306端口被PID为1234的tomc...