Python统计安卓log中Anr、Crash出现的数量
作为测试,在测试工作中一定会经常抓log,有时log收集时间很长,导致log很大,可能达到几G,想找到能打开如此大的log文件的工具都会变得困难;即使log不大时,我们可以直接把log发给开发同学去分析定位问题,这样对我们测试人员来说最“省事”,但同时也不能很好的体现出测试人员的价值,那有没有更好的办法来提升测试人员的产出呢?是不是可以通过自动化的形式来完成对log中的各种问题的定位呢?
针对以上需求,我写了一个Python脚本,脚本能完成的工作:
1.统计出log中Anr,Crash,Singnal等出现的次数,并以txt文本的形式输出
2.在log中定位出现Anr,Crash,Singnal的行数,并截取问题出现行数上下3000行的数据,再以txt文本的形式输出(为什么是取上下3000行的数据?开发同学说一般定位问题时看问题出现的坐在行和下一行,如果不能准确定位问题,就需要查看log中上下7秒所打印出的内容)
脚本的使用方法:
1.运行脚本
2.待提示“将Log文件拖入窗口,并点击回车”,完成提示的操作
3.等待脚本执行完成(可能是漫长的等待)。。。
4.生成两个txt文件:log1、log2
5.log1中统计各类问题出现的次数,log2中截取上下3000行的数据
脚本:
1 # -*- coding: cp936 -*- #为了在窗口中显示中文
2 # -*- coding: utf8 -*-
3
4 #Author:
5 #Data:2018-1-17
6
7 import os
8 import string
9
10 log_and_file_Path = ''
11 log_path = ''
12 key_words = ['ANR in', 'FATAL EXCEPTION', 'signal 6', 'signal 7', 'signal 11', ': Fatal', 'OutOfMemoryError']
13 anr_num = 0
14 singnal6_num = 0
15 singnal7_num = 0
16 singnal11_num = 0
17 exception_num = 0
18 other_fatal_num = 0
19 oom_num = 0
20 key_list = []
21 lines = 0
22
23 #遍历log,记录需提取的行号,记录各项次数
24 def Process():
25 global anr_num, singnal6_num, singnal7_num, singnal11_num, exception_num, other_fatal_num, lines
26 f = open(log_and_file_Path)
27 i = 0
28 for line in f:
29 i += 1
30 if string.find(line, key_words[0]) != -1:
31 anr_num = anr_num + 1
32 key_list.append(i)
33 print '发现 ANR 行号:%s / %s' % (i, line)
34 elif string.find(line, key_words[1]) != -1:
35 exception_num = exception_num + 1
36 key_list.append(i)
37 print '发现 EXCEPTION 行号:%s / %s' % (i, line)
38 elif string.find(line, key_words[2]) != -1:
39 singnal6_num = singnal6_num + 1
40 key_list.append(i)
41 print '发现 signal 6 行号:%s / %s' % (i, line)
42 elif string.find(line, key_words[3]) != -1:
43 singnal7_num = singnal7_num + 1
44 key_list.append(i)
45 print '发现 signal 7 行号:%s / %s' % (i, line)
46 elif string.find(line, key_words[4]) != -1:
47 singnal11_num = singnal11_num + 1
48 key_list.append(i)
49 print '发现 signal 11 行号:%s / %s' % (i, line)
50 elif string.find(line, key_words[5]) != -1:
51 other_fatal_num = other_fatal_num + 1
52 key_list.append(i)
53 print '发现 其它类型FATAL 行号:%s / %s' % (i, line)
54 elif string.find(line, key_words[6]) != -1:
55 other_fatal_num = other_fatal_num + 1
56 key_list.append(i)
57 print '发现 OOM问题 行号:%s / %s' % (i, line)
58
59 else:
60 continue
61 f.close()
62 lines = i
63
64 def SetLogAndFilePath():
65 global log_and_file_Path
66 log_and_file_Path = raw_input('将Log文件拖入窗口,并点击回车\n\n')
67 log_and_file_Path = log_and_file_Path.replace('\\','\\\\')
68
69 def SetLogPath():
70 global log_path
71 log_path = log_and_file_Path.replace(log_and_file_Path.split('\\\\')[-1], '')
72
73 def SaveLog1(fileName):
74 global log_path
75 f = open(log_path+fileName, 'wb')
76 log_str = 'anr = %s \nsingnal 6 = %s\nsingnal 7 = %s \nsingnal 11 = %s \nexception = %s \nother fatal = %s \noom = %s' % (anr_num, singnal6_num, singnal7_num, singnal11_num, exception_num, other_fatal_num, oom_num)
77 f.writelines(log_str)
78 f.close()
79
80 def SaveLog2(fileName, checklines):
81 global log_and_file_Path, log_path
82 d = open(log_path + fileName, 'wb')
83 d.writelines('')
84 for num in key_list:
85 print '*'*50
86 d.write('\n'+'*'*50+'\n'+'*'*50+'\n\n\n')
87 if num >= checklines:
88 min_num = num - checklines
89 else:
90 min_num = 0
91 if num + checklines <= lines:
92 max_num = num + checklines
93 else:
94 max_num = lines
95 i2 = 0
96 f = open(log_and_file_Path)
97 for line in f:
98 i2 += 1
99 if i2 >= min_num and i2 <= max_num:
100 new_context = line+'\n'
101 d.write(new_context)
102 print 'Save %s' % line
103 else:
104 continue
105 f.close()
106 d.close()
107
108
109 if __name__ == '__main__':
110 SetLogAndFilePath()
111 SetLogPath()
112 Process()
113 SaveLog1('log1.txt')
114 SaveLog2('log2.txt', 3000)
1.可以在第12行的list中定义要查找问题的关键字
2.目前只在windows环境中跑通
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示