作为测试,在测试工作中一定会经常抓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文件拖入窗口,并点击回车 ') 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 singnal 6 = %s singnal 7 = %s singnal 11 = %s exception = %s other fatal = %s oom = %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(' '+'*'*50+' '+'*'*50+' ') 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+' ' 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环境中跑通