python 监控logcat关键字功能
本文主要介绍使用Python调用ADB命令实现实时监控logcat关键字的功能
采用多进程,可同时监控多个设备,监控多个关键字。
需要配置ADB环境,具体配置就不多介绍,随便搜一下一大把,直接上代码
通过一个全局变量控制开启和关闭监控功能,INSTRUCTION用于根据指令获取对应的方法名
importos,threading,datetime
#获取当前文件所在目录,拼接出LOG路径
LOG_PATH=os.path.join(os.path.dirname(os.path.abspath(__file__)),"log")
#配置需要监控的关键字
KEYWORDS=["ANR","NullPointerException","CRASH","ForceClosed"]
#控制开启和关闭
STOP_LOGCAT=True
#指令对应具体操作
INSTRUCTION={
"1":"filter_keywords",
"2":"stop_filter_keywords",
"3":"exit"
}
deffilter_keywords():
globalSTOP_LOGCAT
STOP_LOGCAT=False
devices=get_devices()#先获取所有连接的设备
print("开始监控关键字")
fordeviceindevices:
t=threading.Thread(target=filter_keyword,args=(device,))
t.start()
defstop_filter_keywords():
globalSTOP_LOGCAT
ifSTOP_LOGCAT:
print("没有正在执行的任务\n")
else:
STOP_LOGCAT=True
print("正在停止关键字监控\n")
监控关键字主函数,
deffilter_keyword(device):
print("设备%s关键字监控已开启"%str(device))
sub=logcat(device)
withsub:
forlineinsub.stdout:#子进程会持续输出日志,对子进程对象.stdout进行循环读取
forkeyinKEYWORDS:
ifline.decode("utf-8").find(key)!=-1:#stdout输出为字节类型,需要转码
message="设备:%s检测到:%s\n"%(device,key)#设备:192.168.56.104:5555检测到:ANR
path=get_log_path("bugreport")#根据时间创建文件夹
bugreport(device,path)#拉取完整日志压缩包到创建的文件夹内
send_message(message)#这里可以换成自己要做的事情,比如发送邮件或钉钉通知
ifSTOP_LOGCAT:
break
print("设备%s关键字监控已停止"%str(device))
sub.kill()
通过subprocess.Popen创建进程执行命令,持续输出日志到stdout
#logcat持续输出日志 deflogcat(device): command="adb-s"+str(device)+"logcat-vtime" sub=subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) returnsub
获取所有已连接设备的方法,执行"adbdevices"后输出如下,通过对命令执行拿到的字符串切割获取所有设备号以列表方式存储
#获取所有device
defget_devices():
command="adbdevices"
res=os.popen(command).read()
devices=[]
res=res.split("\n")
foriinres:
ifi.endswith("device"):
devices.append(i.split('\t')[0])
returndevices
#打包下载所有日志到当前目录
defbugreport(device,path):
os.chdir(path)#bugreport会下载日志到当前文件夹,所以需要先切换到已经创建的目录
command="adb-s"+str(device)+"bugreport"
subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,bufsize=-1)
print("设备:%s日志路径:%s"%(str(device),path))
以 当前文件所在目录/年/月/日格式获取日志路径,如果不存在自动创建
#获取日志存放路径,如果不存在则按日期创建
defget_log_path(tag):
year=datetime.datetime.now().strftime('%Y')
month=datetime.datetime.now().strftime('%m')
day=datetime.datetime.now().strftime('%d')
path=os.path.join(LOG_PATH,tag,year,month,day)
ifnotos.path.exists(path):
os.makedirs(path)
returnpath
main函数,循环接收指令,根据接收的指令拿到方法名,并通过eval()方法执行。
defmain():
whileTrue:
print("-"*100)
print("1:开启关键字监控\n2:停止关键字监控\n3:退出")
print("-"*100)
instruction=str(input("\n\n请输入要进行的操作号:\n"))
print("-"*100)
whileinstructionnotinINSTRUCTION.keys():
instruction=str(input("\n\n输入无效,请重新输入:"))
ifint(instruction)==9:
exit()#TODO退出前需要判断是否有正在执行的monkey任务和关键字监控任务
eval(INSTRUCTION[str(instruction)]+"()")
if__name__=='__main__':
main()
这里只写了开启日志监控和关闭的方法,中间有些处理可以根据自己需要实现,比如检测到关键字之后除了拉取所有日志外,可以发送邮件、钉钉之类的通知,根据自己需要去实现。
总结
到此这篇关于python监控logcat关键字功能的文章就介绍到这了,更多相关python监控logcat关键字内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。