天天看點

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環境中跑通