自动统计安卓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文件拖入窗口,并点击回车\n\n')
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 \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)
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('\n'+'*'*50+'\n'+'*'*50+'\n\n\n')
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+'\n'
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环境中跑通

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

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

    作为测试,在测试工作中一定会经常抓log,有时log收集时间很长,导致log很大,可能达到几G,想找到能打开如此大的log文件的工具都会变得困难:即使log不大时,我们可以直接把log发给开发同学去分 ...

  2. 脚本自动统计安卓log中Anr、Crash等出现的数量(Python)

    作为测试,在测试工作中一定会经常抓log,有时log收集时间很长,导致log很大,可能达到几G,想找到能打开如此大的log文件的工具都会变得困难:即使log不大时,我们可以直接把log发给开发同学去分 ...

  3. 在SystemOut.log中发现HMGR0152W: 检测到CPU 饥饿的消息 <转载>

    今天系统报警了!!!!!顿时人又不好了!!!查看系统日志, 报错如下: Did not receive adequate CPU time slice. Last known CPU usage ti ...

  4. C++中调用Python脚本(转载)

    转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...

  5. 统计mysql数据库中数据表/字段等数量的sql

    1.查询一个表中有多少个字段: SELECT COUNT(*) FROM information_schema. COLUMNSWHERE table_schema = '数据库名'AND table ...

  6. 统计MSSQL数据库中所有表记录的数量

    SELECT a.name as '表名', b.rows as '记录数' FROM sysobjects AS aINNER JOIN sysindexes AS b ON a.id = b.id ...

  7. C++中调用Python脚本

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...

  8. orale 10g和11g中的自动统计任务

    orale 10g和11g中的自动统计任务 博客分类:  数据库相关/oracle   1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Or ...

  9. Oracle 10g和11g中的自动统计任务

    1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动 ...

随机推荐

  1. 关于javascript中的typeof和instanceof介绍

    typeof用来检测给定变量的数据类型 instanceof用来检测对象的类型 typeof用来检测给定变量的数据类型(也可叫做基本类型,基本数据类型.包含undefined.boolean.stri ...

  2. 【转】JPG打包压缩后比原来尺寸还大

    作者:刘源链接:https://www.zhihu.com/question/40371280/answer/86262934来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  3. 代替Reflection(反射)的一些方法(转)

    作者:JustRun 林肯: http://www.cnblogs.com/JustRun1983/p/3830764.html 代替Reflection(反射)的一些方法(转) 2014-07-08 ...

  4. SimpleReflection

    [SimpleReflection] 取法线的x.y作为reflection-map的uv. Shader "Custom/SimpleReflection" { Properti ...

  5. 再谈C#编码规范

    编码规范是老生常谈的问题,现在再看代码规范可能不会再去在意变量,控件的命名方法等,而是更加关注代码的实用性. 首先我们要明白一下几点, 1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为 ...

  6. Tomcat 用startup.bat启动,卡住解决

    相比较用eclipse发布项目,直接在tomcat的bin目录下用startup.bat启动需要多做一些工作,而且直接运行startup.bat不会报错,不利于解决问题 所以最好的选择是在安装部署时 ...

  7. redis在Web中的使用

    redis是一个键值对数据库,用于缓存数据. redis是一个key-value存储系统.和Memcached数据库类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  8. XSS学习笔记

    本片文章是读<<XSS跨站脚本gj剖析与防御>>一书的总结 常见的XSS攻击主要用于1.网络钓鱼,盗用用户账号2.窃取cookies 非httponly情况下,读取docume ...

  9. 八种主流NoSQL数据库系统对比(转)

    出处:http://database.51cto.com/art/201109/293029.htm 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫 ...

  10. mvc数组绑定-jquery ajax

    var list=[];//数组 list[0]=1001; list[1]=1002; list[1]=1003; var json_data = { selected: list}; $.ajax ...