自动统计安卓log中Anr,Crash,Singnal出现数量的Python脚本 (转载)

自动统计安卓log中Anr,Crash,Singnal出现数量的Python脚本

 

转自:https://www.cnblogs.com/ailiailan/p/8304989.html

作为测试,在测试工作中一定会经常抓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行的数据

脚本:

# -*- coding: cp936 -*-   #为了在窗口中显示中文
# -*- coding: utf8 -*-

#Author:Yannan.Jia
#Data:2018-1-17

import os
import string

log_and_file_Path = ''
log_path = ''
key_words = ['ANR in', 'FATAL EXCEPTION', 'signal 6', 'signal 7', 'signal 11', ': Fatal', 'OutOfMemoryError']
anr_num = 0
singnal6_num = 0
singnal7_num = 0
singnal11_num = 0
exception_num = 0
other_fatal_num = 0
oom_num = 0
key_list = []
lines = 0

#遍历log,记录需提取的行号,记录各项次数
def Process():
    global anr_num, singnal6_num, singnal7_num, singnal11_num, exception_num, other_fatal_num, lines
    f = open(log_and_file_Path)
    i = 0
    for line in f:
        i += 1
        if string.find(line, key_words[0]) != -1:
            anr_num = anr_num + 1
            key_list.append(i)
            print '发现 ANR 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[1]) != -1:
            exception_num = exception_num + 1
            key_list.append(i)
            print '发现 EXCEPTION 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[2]) != -1:
            singnal6_num = singnal6_num + 1
            key_list.append(i)
            print '发现 signal 6 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[3]) != -1:
            singnal7_num = singnal7_num + 1
            key_list.append(i)
            print '发现 signal 7 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[4]) != -1:
            singnal11_num = singnal11_num + 1
            key_list.append(i)
            print '发现 signal 11 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[5]) != -1:
            other_fatal_num = other_fatal_num + 1
            key_list.append(i)
            print '发现 其它类型FATAL 行号:%s / %s' % (i, line)
        elif string.find(line, key_words[6]) != -1:
            other_fatal_num = other_fatal_num + 1
            key_list.append(i)
            print '发现 OOM问题 行号:%s / %s' % (i, line)

        else:
            continue
    f.close()
    lines = i

def SetLogAndFilePath():
    global log_and_file_Path
    log_and_file_Path = raw_input('将Log文件拖入窗口,并点击回车

')
    log_and_file_Path = log_and_file_Path.replace('\','\\')

def SetLogPath():
    global log_path
    log_path = log_and_file_Path.replace(log_and_file_Path.split('\\')[-1], '')

def SaveLog1(fileName):
    global log_path
    f = open(log_path+fileName, 'wb')
    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)
    f.writelines(log_str)
    f.close()

def SaveLog2(fileName, checklines):
    global log_and_file_Path, log_path
    d = open(log_path + fileName, 'wb')
    d.writelines('')
    for num in key_list:
        print '*'*50
        d.write('
'+'*'*50+'
'+'*'*50+'


')
        if num >= checklines:
            min_num = num - checklines
        else:
            min_num = 0
        if num + checklines <= lines:
            max_num = num + checklines
        else:
            max_num = lines
        i2 = 0
        f = open(log_and_file_Path)
        for line in f:
            i2 += 1
            if i2 >= min_num and i2 <= max_num:
                new_context = line+'
'
                d.write(new_context)
                print 'Save %s' % line
            else:
                continue
        f.close()
    d.close()


if __name__ == '__main__':
    SetLogAndFilePath()
    SetLogPath()
    Process()
    SaveLog1('log1.txt')
    SaveLog2('log2.txt', 3000)

脚本说明:

1.可以在第12行的list中定义要查找的问题的关键字

2.目前只在windows环境中跑通

原文地址:https://www.cnblogs.com/yuany66/p/10796880.html