美文网首页大数据 爬虫Python AI Sql
利用 Pandas 分析日志数据

利用 Pandas 分析日志数据

作者: 头顶一根发的程序猿 | 来源:发表于2019-08-28 15:03 被阅读0次

    1、简介

    app程序在日常运行中会生成多种非结构化的日志数据,由于可读性差通常仅仅用于排错。若能将数据处理成结构化表格信息,则可便于分析各步骤的执行状况例如起止时间、耗时,进而辅助性能与维稳性的优化。此文主要通过非结构化数据日志文件样例,来介绍如何利用Pandas中的技巧,完成数据从非结构化到结构化的过程。

    2、获取数据

    Demo数据样例

    样例数据如下

    步骤1 开始

    步骤1: : 任务1 : Followed link after success : 开始执行任务 (2019/05/10 02:00:22.177)

    步骤1: : 任务1 : [nr=6, errors=0, exit_status=0, result=true] : 任务执行完毕 (2019/05/10 02:00:45.227)

    步骤1: : 任务2 : Followed link after success : 开始执行任务 (2019/05/10 02:00:45.227)

    步骤1: : 任务2 : [nr=6, errors=0, exit_status=0, result=true] : 任务执行完毕 (2019/05/10 02:09:21.490)

    步骤2: : START : Start of job entry : 开始执行任务 (2019/05/10 02:10:26.177)

    步骤2: : START : [nr=7, errors=0, exit_status=0, result=true] : 任务执行完毕 (2019/05/10 02:10:26.179)

    步骤2: : 任务5 : Followed无条件的链接 : 开始执行任务 (2019/05/10 02:10:26.179)

    步骤2: : 任务5 : [nr=7, errors=0, exit_status=0, result=true] : 任务执行完毕 (2019/05/10 02:17:51.991)

    如上样例,源日志记录中包含步骤名称、任务名称、执行状态及执行的时间。带有这样信息的数据行才是待提取的数据记录。

    提取源数据中的指定记录

    通过如上分析,我们只需要提取有效信息,即源日志文件中包含': :''标识的行记录。先将源日志存入列表,再将列表存入dataframe对象的message字段。可参考如下。

    lst_log = []

    log_dir =r'D:myPCPythonVScodeBookDataSetpj1_日志分析log20190101.txt'

    withopen(log_dir, encoding='utf-8')aslog_etl:

    forlineinlog_etl:

    # 逐行读取数据 ,只取有效数据 

    if' :  : 'inline:

    lst_log.append(line.strip())

    df_etllog = pd.DataFrame({'message':lst_log})

    df_etllog.head()

    数据预览1

    预览1-源日志数据入DF

    3、数据解析

    提取核心字段数据

    日志数据的核心内容均以':'标记,可用来作分割符。此处利用pandas的str.split()函数来切分字段,并扩展成多列。另外,通过join将源数据记录也合并入新的数据,便于核查解析的正确性。

    df_etllog1 = df_etllog['message'].str.split(' : ',expand =True)

    # 重命名列

    df_etllog1.columns=['步骤名称','c1','任务项','c2','状态']

    df_etllog2 = df_etllog1.join(df_etllog)

    数据预览2

    预览2-提取核心字段

    解析日期字段

    观察以上数据得知日期信息并没有被正确分割解析。此处需要单独对该字段进行二次拆分,以'('为标识,并置空')' 字符 、更改为日期数据类型

    df_etllog3 = df_etllog2['状态'].str.split('(',expand=True)

    df_etllog3.columns=['完成状态','时间']

    # 去除字符

    df_etllog3['时间'] = df_etllog3['时间'].str.replace(')','')

    # 转化为时间类型

    # df_etllog3['时间'].astype(np.datetime64)

    df_etllog3['时间'] = pd.to_datetime(df_etllog3['时间'])

    # 索引重命名

    df_etllog4 = df_etllog3.join(df_etllog2)[['步骤名称','任务项','完成状态','时间']]

    df_etllog4.index.name='执行顺序'

    数据预览3

    预览3-解析时间字段

    分组计算

    1、取起止时间,基于如上结构数据,利用groupby按指定列进行分组聚合,得到任务的起止时间,并reset索引,保留分组字段。

    df_etllog5 = df_etllog4.groupby(['步骤名称','任务项'])['时间'].agg([np.min, np.max]).rename(columns={'amin':'开始时间','amax':'结束时间'}).reset_index()

          2、利用起止时间,作减计算耗时,单位精确到分钟(dt.seconds/60)。

    df_etllog5['耗时(分钟)'] = (df_etllog5['结束时间'] - df_etllog5['开始时间']).dt.seconds/60

    数据预览4

    预览4-解析时间字段

    4、简单可视化

    到这里,其实已经完成了数据清洗的目标。基于这份结构化的数据,可以很方便分析日常各任务的运行状态及耗时情况。此处提供如下参考,利用条形图按耗时展现TOP 10 任务。

    提取耗时超过阈值(例如5分钟)的任务,并降序,作为重点分析对象

    df_rs5min = df_etllog5[df_etllog5['耗时(分钟)'] >5].sort_values(['开始时间'], ascending=True)

    matplotlib利用条形图可视化

    plt.barh(df_rsL5min['任务项'], df_rsL5min['耗时(分钟)'],

    height=0.8,

    linestyle='--',

    alpha=0.8)

    plt.show()

    5、小结

    利用pandas的这些基本功能来解析固定格式的非结构化数据,确实很得心应手。只要日志文件能按统一的规则存储,则仍然能无压力解析。基于结构化的数据,能很方便利用可视化工具完成日常的性能监控报告。欢迎分享、尝试。

    相关文章

      网友评论

        本文标题:利用 Pandas 分析日志数据

        本文链接:https://www.haomeiwen.com/subject/veapectx.html