作为测试,在测试工作中一定会经常抓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. if __name__ == '__main__':
  109. SetLogAndFilePath()
  110. SetLogPath()
  111. Process()
  112. SaveLog1('log1.txt')
  113. SaveLog2('log2.txt', 3000)

脚本说明:

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

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

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

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

    自动统计安卓log中Anr,Crash,Singnal出现数量的Python脚本   转自:https://www.cnblogs.com/ailiailan/p/8304989.html 作为测试, ...

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

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

  3. 使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  4. sql server编写通用脚本自动统计各表数据量心得

    工作过程中,如果一个数据库的表比较多,手工编写统计脚本就会比较繁琐,于是摸索出自动生成各表统计数据量脚本的通用方法,直接上代码: /* 脚本来源:https://www.cnblogs.com/zha ...

  5. PowerShell脚本自动设置安卓手机wifi代理

    在实际测试工作中,经常要将安卓手机通过wifi代理的形式连接到本机的fiddler或charles服务器代理进行抓包测试.最近一直在想,有没有什么方法可以自动设置安卓手机的wifi代理,曾经想通过修改 ...

  6. [linux] shell脚本编程-统计日志文件中的设备号发通知邮件

    1.日志文件列表 比如:/data1/logs/2019/08/15/ 10.1.1.1.log.gz 10.1.1.2.log.gz 2.统计日志中的某关键字shell脚本 zcat *.gz|gr ...

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

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

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

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

  9. 自动清理IIS log 日志脚本

    系统环境:windows server 2012 r2 IIS 版本:IIS8 操作实现清理IIS log File 脚本如下: @echo off ::自动清理IIS Log file set lo ...

随机推荐

  1. Spring中,关于IOC和AOP的那些事

    一.spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很 ...

  2. vuex动态引入store modules

    主要解决的问题每次建一个module需要自己去主index.js里面去注册 为了偷懒,也为了避免团队开发时同时对index.js 进行修改引发冲突 所以在index.js中 动态的对子目录和模块进行注 ...

  3. maven中servlet报错:不识别此servlet问题的解决办法

    原因 使用maven集成的tomcat插件的时候,tomcat的lib中,自带servlet-api和jsp. 如果maven中再次导入了这两个jar,会造成jar包冲突现象. 解决办法 我们只是想编 ...

  4. java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService

    这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...

  5. 通过C#代码调用Dynamics 365 Web API执行批量操作

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. STL 中 string 的使用

    赋值 string 类型变量可以直接赋值 str = "string"; // str 是 一个 string 类型变量 //等价于 str.assign("string ...

  7. MATLAB聚类有效性评价指标(外部)

    MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看:MATLAB.聚类.MATLAB聚类有效性评价指 ...

  8. acwing 110 防晒

    https://www.acwing.com/problem/content/description/112/ 有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的 ...

  9. 01. Go 语言简介

    Go语言简介 引用原文地址:http://m.biancheng.net/golang/ Go语言也称 Golang,兼具效率.性能.安全.健壮等特性.这套Go语言教程(Golang教程)通俗易懂,深 ...

  10. awk命令使用整理

    1. awk默认以空格分隔, 可摘出指定位置的内容, 通常用法如下( 文件名称为file.txt ): 文件中行内容为:  12:3   a  4:56   b awk  '{print $1}'  ...