• python使用patterns解析loguru日志,从日志中提取结构化数据


    loguru 的 github页面是:https://github.com/Delgan/loguru

    log pattern可以认为是对日志的分组,一种日志格式format,对应一种patterns,可以快速的对日志进行筛选并提取,是非常高效的日志分析的方法(或思路)

    patterns解析日志流程

    比如使用loguru打印一些代码:

    这段代码的含义是:使用文件my_debug.log,保存DEBUG级别的数据

    from loguru import logger
    
    logger.add("my_debug.log", filter=lambda record: "DEBUG" in record['level'].name, level="DEBUG",
               format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {message}", enqueue=True)
    logger.debug({"info": "debug", "name": "小明", "age": 22})
    logger.debug({"info": "debug", "name": "小a", "age": 22})
    logger.debug({"info": "debug", "name": "小b", "age": 22})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行后,得到my_debug.log文件的内容是:

    2022-11-25 09:45:13.018 DEBUG {'info': 'debug', 'name': '小明', 'age': 22}
    2022-11-25 09:45:13.018 DEBUG {'info': 'debug', 'name': '小a', 'age': 22}
    2022-11-25 09:45:13.019 DEBUG {'info': 'debug', 'name': '小b', 'age': 22}
    
    • 1
    • 2
    • 3

    使用parse解析日志:

    from loguru import logger
    import dateutil
    from dateutil.parser import parser
    
    pattern = r"(?P
    caster_dict = dict(time=dateutil.parser.parse, level=str)  # Transform matching groups
    
    for log_groups in logger.parse("my_debug.log", pattern, cast=caster_dict):
        for k, v in log_groups.items():
            print(k, v)
        print("========================")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    得到的结果:

    time 2022-11-25 09:45:13.018000
    level DEBUG
    message {'info': 'debug', 'name': '小明', 'age': 22}
    ========================
    time 2022-11-25 09:45:13.018000
    level DEBUG
    message {'info': 'debug', 'name': '小a', 'age': 22}
    ========================
    time 2022-11-25 09:45:13.019000
    level DEBUG
    message {'info': 'debug', 'name': '小b', 'age': 22}
    ========================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    pattern构建方法

    pattern是日志解析的核心,当然我们可以直接构建正则表达式,来匹配对应的数据,但是使用模版与pattern是一对,使用一个日志模板,就可以匹配pattern进行提取

    我们看日志的内容是:

    2022-11-25 09:45:13.018 DEBUG {'info': 'debug', 'name': '小明', 'age': 22}
    
    • 1

    解析的pattern如下:

    (?P
    • 1

    以第一个括号中的 (?P为例:

    1. 其中(?P表示解析后的key是time;同理换成(?P)表示解析后的key是ahahahahaha;
    2. 后面的\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3}是匹配日期的正则表达式;最后 message的.*表示后面的内容都是message。

    根据日志的模版format,构造对应的pattern即可得到日志解析后的结果

  • 相关阅读:
    ThinkPHP6 输出二维码图片格式 解决与 Debug 的冲突
    什么是职业规划?如何进行职业规划?
    Java:为什么Java比其他编程语言好?
    好用的笔记软件推荐
    你对量化程序化交易接口有哪些误区?
    Qt Design Studio
    基于FPGA的ALU计算器verilog实现
    java中有哪些并发的List?只知道一种的就太逊了
    c++11 入门基础
    【Linux专题】配置存储多路径(一)
  • 原文地址:https://blog.csdn.net/weixin_35757704/article/details/128032142