• 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文件拖入窗口,并点击回车
    
    ')
     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环境中跑通

  • 相关阅读:
    2018-04-27 搭建Python官方文档翻译环境-汉化示例代码
    2018-04-21 搭建Python官方文档翻译环境
    2018-01-19 Xtext试用: 5步实现一个(中文)JVM语言
    2018-02-27 "Literate Programming"一书摘记之一
    2018-02-18 Antlr4实现简单语言之条件语句
    2018-02-17 中文代码示例[译]Scala中创建隐式函数
    2018-02-16 中文代码示例之冒泡算法, 后感
    C code example for strdup
    Hash table: why size should be prime?
    Hash table lengths and prime numbers
  • 原文地址:https://www.cnblogs.com/ailiailan/p/8304989.html
Copyright © 2020-2023  润新知