Python 处理log日志可视化操作

image.png

作为一个学完Python基础知识的测试,终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python。

在我们工作中,经常会查看大量异常的日志log,上千行数据如何统计出我要数据,并清晰反馈RD,这不之前学习的Python,这次派上用场了。

本期,我们一起来实现如何使用Python可视化处理log日志,一起来涨知识吧~

1. 问题背景

近期,RD对软件进行一次接口请求速度优化的更新,必须要在两天内对更新内容进行反馈。首先接到任务,作为测试的我,对基本的接口功能测完后,发现进入到性能测试环境,万行日志怎么看:

image.png

常规有如下几种操作:

  • windows 电脑自带的TXT文本工具:无批量搜索功能
  • Notepad++/Vscode :批量搜索,只能统计总数,无法可视化

image.png

有没有人遇到这种问题,像头铁的我将Notpad++批量筛选出来的数据,复制到Excel表中,进行字符处理统计,一顿操作,复用性太差了~~~~

果断使用Python,自己写一个脚本帮我自动处理分析log日志,其他时间摸摸鱼岂不是美哉。

  • 脚本需求比较简单,主要分为三部分:

    • 日志文件,数量不定数
    • 多个字段信息
    • 可视化展示数据变化

2. 批量修改log文件名

log日志文件格式是txt格式,且日志文件名是32位的taskID与报告ID组成taskID_reportID 形式如:60ac5624493b11eda5771e56c768036b_31.txt。

由于报告名字是32位数字,不利于我们跟踪那个设备端数据,因此得到报告后需要将报告名改为设备ID(U21041489-0A01245)。

代码实现思路:

    1. 将测试报告放入指定的目录下:如E:\screen_log
    1. 遍历读取每一份报告,获取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
    
    
    1. 再次遍历每一份报告,按顺序将报告重名为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)
    
    

    image.png

    设备列表和文件报告重名都已经搞定,那么接下对报告内容字段进行提取啦,开启第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循环遍历
    • 折线图中,绘制一条平均线,可以看到数据每时刻的变化 image.png
  • 绘制饼图:
    • 需要指出需要关注几个区间:比如0.10.5,0.50.6等
    • 遍历key-vaule字典,在指定区间的次数 image.png
  • 绘制散点图:
    • 将收集到耗时时间点,使用Counter统计出每个时间的次数 image.png

5. log 分析报告结果呈现

image.png

image.png

image.png

总结

本次,在执行任务中使用Python处理文件重名、抓取关键字数据和可视化展示三个环境,做到了可以解放60%的双手吧,那40%,自动触发任务、下载文件、报告输出和email提醒等等功能还没有实现,接下来也是我努力下个目标实现

以上是本期内容,欢迎大佬们点赞,评论,下期见~~

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值