Python学习之道-烤机测试日志Log分析统计

  • 问题引出
  • 一、环境准备
  • 二、实践代码
    • 1、初步实现
    • 2、更新CSV文件写入统计结果
    • 3、运行脚本
    • 4、实现遍历多个Log并汇总结果到Excel
  • 三、遇错记录
    • 1、except VaueError,e:SyntaxError: invalid syntax
    • 2、time.clock 弃用警告DeprecationWarning
    • 3、读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte

PS:自己学习Python已经断断续续有1年了,之前没有写博客的习惯,前段日子去图书馆借阅了《程序员的自我修养》,觉得应该养成写博客的习惯,将自己学习的过程记录下来,方便自己也方便大家,记录自己学习历程和思路,后面回顾也方便易上手。最主要的是方面自己查找 哈哈

问题引出

工作中经常需要检查样机老化烤机、可靠性环境温湿试验等诸多烤机的日志文件,并统计Log文件中的结果汇总成测试报告的数据。
痛点:
一次烤机的台数往往少则几台多则几十台,人工检查Log文件工作量大、繁索
解决思路:
通过编写Python脚本来实现对Log文件的每一行遍历分析统计,加上一些前后判断逻辑,最终输出需要的有用信息至表格文件

一、环境准备

参照网上的教程,消化吸收。

参考文档:
Python中 sys.argv[]的用法简明解释 - 覆手为云p - 博客园
笔记:
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键。
因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。

Python split()方法 | 菜鸟教程
笔记:
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
Python 文件I/O | 菜鸟教程

二、实践代码

读取文件->遍历每行->剔除无关行->判断启动标志行->回溯上次掉电最后一行->对行切片Get数值->对数据判断记录

1、初步实现

@2019/04/08
晚上加班编写,实现分析Log并将结果打印

# -*- coding: UTF-8 -*-import sys,timeclass DisplayFormat(object):def format_size(self,size):'''格式化大小SIZE'''KB = 1024                   # KB -> B  1024MB = 1048576                # MB -> B  1024 * 1024GB = 1073741824             # GB -> B  1024 * 1024 * 1024TB = 1099511627776          # TB -> B  1024 * 1024 * 1024if size >= TB:size = str(size >> 40) + 'T'elif size < KB:size = str(size) + 'B'elif size >= GB and size < TB:size = str(size >> 30) + 'G'elif size >= MB and size < GB:size = str(size >> 20) + 'M'else:size = str(size >> 10) + 'K'return sizeformatstring = '%-18s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s'def echo_line(self):'''输出头部横线'''print (self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,))def echo_head(self):'''输出头部信息'''print (self.formatstring % ('IP','Traffic','Time','Time%',200,404,403,503,500,302,304))def echo_error(self):'''输出错误信息'''print ('使用: ' + sys.argv[0] + ' filepath [number]')def echo_time(self):'''输出脚本执行时间'''print ('The script is running %s second' % time.process_time())class AnalysisFile(object):'''文件分析处理类'''def __init__(self):'''初始化一个空字典'''self.empty = {}def split_line_todict(self,line):'''传入文件的每一行取出0、8、9字段 生成字典 并返回这个字典'''line_split = line.split('] ',2)     ##用split讲该行的单词分割成列表,每个单词就时一个列表项目,split的默认参数是空格,所以不传递任何参数时分割空格,在英文中也就等同于分割单词line_date = line_split[0].replace('[','')        #去除中间字符,可以使用replace()函数if 'Welcome to GkLinux' in line_split[1]:line_dict = {'date':line_date,'str_name':'Welcome to GkLinux'}elif 'bdfixed = ' in line_split[1]:line_split = line_split[1].split(',',9)bdfixed = int(line_split[0].split()[2])unfix_max = int(line_split[4].split()[2])common_state = int(line_split[5].split()[2])time_2 = int(line_split[7].split()[2])line_dict = {'date':line_date,'str_name':'bdfixed','bdfixed':bdfixed,'unfix_max':unfix_max,'common_state':common_state,'time_2':time_2}else:line_dict= {}return line_dict def read_log(self,logs):last_line = {}this_line = {}time_2 = 0for line in logs:try:dict_line = self.split_line_todict(line)if len(dict_line) > 1:str_name = dict_line['str_name']# print (str_name)if 'Welcome to GkLinux' in str_name:if last_line is {}:passelse:this_line = dict_line# print(last_line)if len(last_line) > 2:if last_line['bdfixed'] == 0:print(last_line)print(this_line)if last_line['unfix_max'] > 120000:print('失锁超2min ',last_line['unfix_max']/1000)time_2 += 1else:last_line = dict_lineexcept ValueError:continueexcept IndexError:continueprint('失锁超2min共',time_2,'次')return self.emptyclass Main(object):def main(self):'''主调函数'''# 初始化DisplayFormat类的实例displayformat = DisplayFormat()args = len(sys.argv)          #获取sys.argv的参数个数if args == 1:                 #说明没有输入外部参数,输出错误print ('Error:缺少待处理log文件名参数')displayformat.echo_error()elif args == 2 or args == 3:    #外部输入了一个或2个参数log_file = sys.argv[1]        #取外部输入的第一个参数(比如脚本名后面跟随的Log文件名)try:files = open(log_file,'r', encoding='UTF-8')print(files.name)if args == 3:                    #取外部输入的第2个参数  要处理的Log文件的lineslines = int(sys.argv[2])else:lines = 0except IOError as e:print (e)displayformat.echo_error()except VaueError as e:print (e)displayformat.echo_error()else:displayformat.echo_error()#AnalysisFile类的实例化fileanalysis = AnalysisFile()# 调用read_log方法news_dict = fileanalysis.read_log(files)# 显示执行脚本的时间printdisplayformat.echo_time()time.sleep(20)if __name__ == '__main__':main = Main()main.main()

2、更新CSV文件写入统计结果

@2019/04/09更新内容:
优化之前的分析计数,并将每次信息写入至CSV文件,便于用Excel打开时行整理出具测试报告
导入re库import re
更新read_log(self,logs)方法

    def read_log(self,logs):last_line = {}this_line = {}files_res = re.sub('.log' , '-res.csv',logs.name)files_res = open(files_res,'w')#, encoding='UTF-8')files_res.write(logs.name+'\n')files_res.write('日期,字段名,锁定状态,最大失锁时长,失锁次数,小于2min次数,超2min的时长(S)\n')time_2 = 0unfix = 0for line in logs:try:dict_line = self.split_line_todict(line)if len(dict_line) > 1:str_name = dict_line['str_name']if 'Welcome to GkLinux' in str_name:if last_line is {}:passelse:this_line = dict_line# print(last_line)if len(last_line) > 2:if last_line['bdfixed'] == 0:print(last_line)files_res.write(last_line['date'] + ','+ last_line['str_name'] + ','+ str(last_line['bdfixed']) + ','+ str(last_line['unfix_max']) + ','+ str(last_line['common_state']) + ','+ str(last_line['time_2']) + '\n')print(this_line)files_res.write(this_line['date'] + ','+ this_line['str_name'] + ','+ ','+ ','+ ','+ '\n')unfix +=1if last_line['unfix_max'] > 120000:print('失锁超2min ',last_line['unfix_max']/1000)files_res.write(last_line['date'] + ','+ '失锁超2min' + ','+ ','+ ','+ ','+ ','+str(last_line['unfix_max']/1000) +'\n')time_2 += 1else:last_line = dict_lineexcept ValueError:continueexcept IndexError:continueprint('失锁超2min共',time_2,'次')files_res.write('' + ','+ '失锁超2min共' +str(time_2) +'次' + ','+ ','+ ','+ ','+'\n')print('掉电前失锁共',unfix ,'次')files_res.write('' + ','+ '掉电前失锁共' +str(unfix) +'次' + ','+ ','+ ','+ ','+'\n')files_res.close()return self.empty

3、运行脚本

将脚本拷贝至和Log文件同一文件夹内,进行命令行,输入如下运行:

在win10的Shell中运行脚本

在win7的cmd中运行脚本

参考博文:
详解Python中re.sub–转载 - nkwy2012 - 博客园
利用python 提取log 文件中的关键句子,并进行统计分析 - 钟宇的栏目 - CSDN博客

4、实现遍历多个Log并汇总结果到Excel

传送门
Python学习之道-处理Excel电子表格 - jszy1314的博客 - CSDN博客

创建Excel并添加表头

         wb = Workbook() #创建Workbook对像sheet = wb.active  #获取活动工作表sheet.title = '****统计'sheet["A1"].value = 'Log文件名'sheet.column_dimensions['A'].width = 40sheet["B1"].value = 'COM号'sheet["C1"].value = '次数'sheet.column_dimensions['C'].width = 22sheet["D1"].value = ''sheet.column_dimensions['D'].width = 18sheet["E1"].value = ''sheet.column_dimensions['E'].width = 18sheet["F1"].value = '详细时长'

遍历当前目录下所有log文件并将统计结果记录入表格

           inx = 0for LogF in os.listdir('.'):if not LogF.endswith('.log'):continuefiles = open(LogF,'r', encoding='UTF-8')print(files.name)fileanalysis = AnalysisFile()# 调用read_log方法logdict = fileanalysis.read_log(files)sheet["A%d" % (inx+2)].value = LogFif 'Serial-COM' in LogF:sheet["B%d" % (inx+2)].value = LogF.split('-',3)[1]sheet["C%d" % (inx+2)].value = logdict['unfix_2min_conut']sheet["D%d" % (inx+2)].value = logdict['unfix_toDown_conut']sheet["E%d" % (inx+2)].value = logdict['unfix_onDown_conut']for i,unfixtime in enumerate(logdict['unfix_2min_list']):col = get_column_letter(i+6)# print(col)sheet[col+"%d" % (inx+2)].value = unfixtimeinx +=1wb.save('统计.xlsx')wb.close()

更新文件分析处理类的代码,返回当前文件执行的分析结果

class AnalysisFile(object):'''文件分析处理类'''def __init__(self):'''初始化一个空字典'''self.empty = {}def read_log(self,logs):last_line = {}this_line = {}files_res = re.sub('\.\w+' , '_res.csv',logs.name)print(files_res)files_res = open(files_res,'w')#, encoding='UTF-8')files_res.write(logs.name+'\n')#files_res.write('date,str_name,bdfixed,unfix_max,common_state,time_2\n')files_res.write('日期,字段名,锁定状态,最大失锁时长,失锁次数,小于2min次数,超2min的时长(S)\n')unfix_2min_conut = 0unfix_2min_list = []unfix_toDown_conut = unfix_onDown_conut = 0for line in logs:try:dict_line = self.split_line_todict(line)if len(dict_line) > 1:str_name = dict_line['str_name']# print (str_name)if 'Welcome to GkLinux' in str_name:if last_line is {}:passelse:this_line = dict_line# print(last_line)if len(last_line) > 2:if last_line['bdfixed'] == 0:       #掉电时为失锁状态files_res.write(last_line['date'] + ','+ last_line['str_name'] + ','+ str(last_line['bdfixed']) + ','+ str(last_line['unfix_max']) + ','+ str(last_line['common_state']) + ','+ str(last_line['time_2']) + '\n')files_res.write(this_line['date'] + ','+ this_line['str_name'] + ','+ ','+ ','+ ','+ '\n')if last_line['unfix_max'] > 0:      #掉电时又失锁次数unfix_onDown_conut +=1else:unfix_toDown_conut +=1                #一直失锁次数if last_line['unfix_max'] > 120000:files_res.write(last_line['date'] + ','+ '失锁超2min' + ','+ ','+ ','+ ','+ ','+str(last_line['unfix_max']/1000) +'\n')unfix_2min_conut += 1unfix_2min_list.append(str(last_line['unfix_max']/1000))else:last_line = dict_lineexcept ValueError:continueexcept IndexError:continue
#此处隐藏files_res.close()self.empty = {'unfix_2min_conut':unfix_2min_conut, 'unfix_toDown_conut':unfix_toDown_conut,'unfix_onDown_conut':unfix_onDown_conut ,'unfix_2min_list':unfix_2min_list  }return self.empty

三、遇错记录

1、except VaueError,e:SyntaxError: invalid syntax

代码如下

         try:.....except IOError as e:

报错如下:

except VaueError,e:^
SyntaxError: invalid syntax

解决方法:

except IOError as e:写成这样就行!用逗号就会语法报错!

2、time.clock 弃用警告DeprecationWarning

F:\MyPythonFile\Log.py:44: DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time insteadprint ('The script is running %s second' % time.clock())
The script is running 0.106214628 second

改用 time.process_time 或 time.perf_counter

3、读取文件时报错UnicodeDecodeError: ‘gbk’ codec can’t decode byte

报错提示如下

UnicodeDecodeError: 'gbk' codec can't decode byte 0x9b in position 6113: illegal multibyte sequence

解决办法1

FILE_OBJECT= open('order.log','r', encoding='UTF-8')

解决办法2

FILE_OBJECT= open('order.log','rb')

参考:
python 读取文件时报错UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 205: illegal multibyte sequence - 梦雨情殇 - 博客园

Python学习之道-烤机测试日志Log分析统计相关推荐

  1. Python学习之道-串口编程TEMI880温箱控制

    Python学习之道-串口编程&TEMI880温箱控制 一.环境准备 安装pyserial库 pyserial库常用函数介绍 参考例程 二.开发实践 1.实践项目 2.协议介绍 2.1 一般的 ...

  2. Python学习之道-串口Modbus开发

    Python学习之道-串口Modbus开发 一.环境准备 二.编程实践 2.1 实践目的 2.2 协议分析 PS:工作中需要实现自动化测试,其中要控制恒温恒湿试验箱,涉及Mogbus通信 一.环境准备 ...

  3. Python学习之道-打包成exe程序

    Python学习之道-打包成exe程序 一.打包成exe程序 Pyinstaller安装 作用 使用 Pyinstaller相关参数 Pyinstaller使用总结 尽量用from.....impor ...

  4. android 常见死机问题--log分析

    android 常见死机问题--log分析 ============================================================================== ...

  5. Python学习笔记 day9 堡垒机前戏之paramiko模块

    SSH SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接 基于公钥密钥连接 基于私钥字符串进行连接 SFTPClient 用于连接远程服务器并执行上传下载 基于用户名密码上传下 ...

  6. Python学习-有道翻译实现post请求(Python自带模块))

    1.前期准备工作 打开chrome浏览器,进入"百度一下"页面,在搜索框输入有道翻译,进入有道翻译官网,右击鼠标选择检查,进入开发者模式,然后在需要翻译的文本框输入翻译内容,接着在 ...

  7. 信号与系统(Python) 学习笔记 (8.1) 离散系统z域分析 -- 系统函数 H(z)

    [总目录] (1) 简介 Intro (2) 傅里叶 Fourier 常用函数的傅里叶变换汇总 (3) LTI 系统 与 滤波器 二次抑制载波振幅调制接收系统 Python (4) 取样 Sampli ...

  8. Python学习 matplotlib库 霍兰德人格分析雷达图

    [Python学习] matplotlib库 绘制霍兰德人格分析雷达图 学习一些Python知识.用matplotlib库进行雷达图的绘制. 实现效果图片: 代码参考:<Python语言程序设计 ...

  9. android 常见死机问题-如何分析

    android 常见死机问题--log分析 ============================================================================== ...

最新文章

  1. vim学习笔记(三)
  2. 2017中国物联网年报:我国传感器竞争力与发达国家的差距
  3. 解决IE6,IE7下子元素使用position:relative、父元素使用overflow:auto后,子元素不随着滚动条滚动的问题...
  4. oracle DB_LINK
  5. 疯了!程序员崩溃的40个瞬间!!!
  6. python语言中的缩进是什么意思_python编程中的缩进是什么意思
  7. POJ1703-Find them, Catch them
  8. 账龄分析表excel模板_做账不用在苦恼表格制作,企业财务管理全套Excel模板给你!领取...
  9. 网络舆情监测关键词怎么设置与搜集的方法技巧
  10. SPSS实现距离分析
  11. cat tee ||
  12. 程序员突然倒地!中软国际回应称系低血糖引发
  13. HDOJ-1823(矩形树,点更新 + 区间查询)
  14. 推荐系统序列化建模总结
  15. Unity3D 解决检测碰撞某类物体的一种方法
  16. sql 语言-单值函数single row functions
  17. Apple 投诉网站
  18. PHP与MySQL外文文献译文和原文_计算机外文翻译---基于PHP和MYSQL的网站设计和实现...
  19. 每粒尘埃都有IP,你信了吗?
  20. 抢票加速靠谱?还是黄牛更靠谱?

热门文章

  1. 青柠起始页-浏览器起始页(一个简洁、美观、实用的浏览器起始页。)
  2. 80后年轻老板创业心经
  3. 国内的智能家居品牌有哪些
  4. Prompt learning系列之入门篇
  5. 图片在section上下居中_给0~1岁的新媒体人:公众号怎么配图?免费图片哪里找?...
  6. fps射击HTML网页游戏,关于Unity中FPS第一人称射击类游戏制作(专题十)
  7. 用Python给PDF批量加密
  8. java maincase 电影票的售卖与购买 day10-11
  9. 读书札记:德鲁克生命中的七堂课(转)
  10. 酷玩网 网站重要修复