likes
comments
collection
share

Python 处理log日志可视化操作

作者站长头像
站长
· 阅读数 25

Python 处理log日志可视化操作

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

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

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

1. 问题背景

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

Python 处理log日志可视化操作

常规有如下几种操作:

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

Python 处理log日志可视化操作

有没有人遇到这种问题,像头铁的我将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)
    

    Python 处理log日志可视化操作

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

5. log 分析报告结果呈现

Python 处理log日志可视化操作

Python 处理log日志可视化操作

Python 处理log日志可视化操作

总结

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

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

本文正在参加「金石计划 . 瓜分6万现金大奖」