自動統計Android logでAnr,Crash,Singnal出現数のPythonスクリプト

18896 ワード

テストとして、テストの仕事の中で必ず常にlogをつかんで、时にはlogの収集时间がとても长くて、logがとても大きくて、数Gに达することができて、このような大きいlogファイルを开くことができるツールを探し当てるのはすべて困难になります;たとえロゴが大きくなくても、私たちは直接ロゴを開発の同級生に送って位置決めの問題を分析することができて、このように私たちのテスト人員にとって最も“手間が省けます”、しかし同時にテスト人員の価値をよく体現することができなくて、それではもっと良い方法がテスト人員の産出を高めることができますか?自動化された形式でlog中の様々な問題の位置づけを完成させることができるのではないでしょうか.
 
以上のニーズに対応して、私はPythonスクリプトを書いて、スクリプトが完成できる仕事をしました.
1.logにおけるAnr,Crash,Singnal等の出現回数を集計し、txtテキストとして出力する
2.logでAnr、Crash、Singnalの行数を特定し、問題が発生した行数の上下3000行のデータを切り取り、txtテキストとして出力する(なぜ上下3000行のデータを取るのか?開発者は一般的な位置決め問題で問題が発生した座行と次の行を見て、問題が正確に特定できない場合は、logの上下7秒で印刷された内容を表示する必要がある)
 
スクリプトの使用方法:
1.スクリプトの実行
2.「ログファイルをウィンドウにドラッグして、車に戻る」というヒントを待って、ヒントの操作を完了する
3.スクリプトの実行が完了するのを待ちます(長い待ち時間の可能性があります).
4.2つのtxtファイルを生成する:log 1、log 2
5.log 1で各種問題が発生した回数を統計し、log 2では上下3000行のデータを切り取る
 
スクリプト:
 
  1 # -*- coding: cp936 -*-   # 
  2 # -*- coding: utf8 -*-
  3 
  4 #Author:Yannan.Jia
  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行目のリストで定義できます
2.現在はwindows環境でしか走っていない
3.レベルが限られています.以上の脚本にはもっと完璧なところがたくさんあるに違いありません.貴重な意見をたくさん言ってください.