作为一个学完Python基础知识的测试,终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python。
在我们工作中,经常会查看大量异常的日志log,上千行数据如何统计出我要数据,并清晰反馈RD,这不之前学习的Python,这次派上用场了。
本期,我们一起来实现如何使用Python可视化处理log日志,一起来涨知识吧~
1. 问题背景
近期,RD对软件进行一次接口请求速度优化的更新,必须要在两天内对更新内容进行反馈。首先接到任务,作为测试的我,对基本的接口功能测完后,发现进入到性能测试环境,万行日志怎么看:
常规有如下几种操作:
- windows 电脑自带的TXT文本工具:无批量搜索功能
- Notepad++/Vscode :批量搜索,只能统计总数,无法可视化
有没有人遇到这种问题,像头铁的我将Notpad++批量筛选出来的数据,复制到Excel表中,进行字符处理统计,一顿操作,复用性太差了~~~~
果断使用Python,自己写一个脚本帮我自动处理分析log日志,其他时间摸摸鱼岂不是美哉。
-
脚本需求比较简单,主要分为三部分:
- 日志文件,数量不定数
- 多个字段信息
- 可视化展示数据变化
2. 批量修改log文件名
log日志文件格式是txt格式,且日志文件名是32位的taskID与报告ID组成taskID_reportID 形式如:60ac5624493b11eda5771e56c768036b_31.txt。
由于报告名字是32位数字,不利于我们跟踪那个设备端数据,因此得到报告后需要将报告名改为设备ID(U21041489-0A01245)。
代码实现思路:
-
- 将测试报告放入指定的目录下:如E:\screen_log
-
- 遍历读取每一份报告,获取deviceiD值列表
- 遍历获取文件内容,可以调用Python os.listdir获取目录文件名字all_files
- 使用for循环遍历all_files,上下文管理with打开并读取file内容
- 使用正则表达式提取到deviceid字段,经过分割、空格去掉,将deviceid添加到res_search列表中,代码示例如下:
def get_filecontext(file_path,search): all_files = os.listdir(file_path) cp = re.compile("'+"+ search +"'"+":"+".*?"+",") res_search = [] for file in all_files: tmp = "" with open(file_path+"\"+file,"r", encoding="utf-8") as f: lines = f.readlines() for line in lines: data = re.search(cp,line) if data: tmp = data.group() break tmp_split = tmp.replace(",","").split(":") if tmp_split[1].strip().strip("'") not in res_search: res_search.append(tmp_split[1].strip().strip("'")) return res_search
-
- 再次遍历每一份报告,按顺序将报告重名为deviceid.txt
- 同理,继续使用os.listdir()方法加载出所有文件名字all_files
- for循环遍历all_files文件,将old_name与new_name传入os.rename进行重命名
def rename_file(file_path,namelist): all_files = os.listdir(file_path) suffix = ".txt" for index,file in enumerate(all_files): prefix = namelist[index] old_name = file_path + os.sep + file new_name = file_path + os.sep + prefix + suffix os.rename(old_name,new_name) new_files = os.listdir(file_path) return new_files
-
4.文件更改前后对比
get_device = get_filecontext(r"E:\webdownload\test","deviceId") print(get_device) new_filename = rename_file(r"E:\webdownload\test",get_device) print(new_filename)
设备列表和文件报告重名都已经搞定,那么接下对报告内容字段进行提取啦,开启第3节动作~
3. log 关键字提取
对报告内容分析,最常用的方法当然是正则表达。本次,对日志中的报告也是正则查找对应的关键字方法。
举一个例子,对ocr_compare字段耗时时间进行获取,log日志每行形式是这样的
[2022-10-25 17:57:15.354200][结束执行关键字]====ocr_compare()[耗时:0.87s]
那么用正则表达要怎么写呢?
-
第一步:先在log日志中找指定关键字如对ocr_compare所在的行```
#正则表达式:
ocr_compare+“().*” -
第二步:找到耗时关键字后面的时间,都是数字.数字组合```
正则表达式
r"\d.\d{1,2}"
关键字提取搞定,剩余的步骤就是遍历每一份日志所有行,将耗时时间存储到列表中
调用collections.Counter()统计每个时间出现的次数
示例代码如下:
def read_log_report(filename,timetype):
cp = re.compile(timetype+"().*")
cp_time = re.compile(r"\d.\d{1,2}")
Time = []
with open("E:\webdownload\screen_log\"+ filename, "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines:
data = re.search(cp, line)
if data and "耗时" in data.group():
Time.append(data.group())
device = [float(re.search(cp_time,t).group()) for t in Time]
d = collections.Counter(device)
return device,d
4. log 关键字可视化分析
在之前学过matplotlib-可视化模块,我们将日志中获取整理的数据,通过图表的形式展示,让可以清晰明了地反映出来,完全做到解放双手啦。
首先,我们需要明确一下,常见的图表及作用:
本次,我们需要统计反映出接口处理耗时,那么只需要绘制3种图形即可:
- 绘制折线图:
- 对第2节中获取到的耗时列表,不用特定处理
- 需要对多个设备的数据绘制,因此需要使用for循环遍历
- 折线图中,绘制一条平均线,可以看到数据每时刻的变化
- 绘制饼图:
- 需要指出需要关注几个区间:比如0.10.5,0.50.6等
- 遍历key-vaule字典,在指定区间的次数
- 绘制散点图:
- 将收集到耗时时间点,使用Counter统计出每个时间的次数
5. log 分析报告结果呈现
总结
本次,在执行任务中使用Python处理文件重名、抓取关键字数据和可视化展示三个环境,做到了可以解放60%的双手吧,那40%,自动触发任务、下载文件、报告输出和email提醒等等功能还没有实现,接下来也是我努力下个目标实现
以上是本期内容,欢迎大佬们点赞,评论,下期见~~
题外话
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
若有侵权,请联系删除