Python通过日志loguru记录程序中的中间变量,同时导出并分析

2023-11-05

在程序运行的时候除了密密麻麻的日志外,这些关键函数的输入输出也十分重要,是回溯与数据核对的唯一

思路

  1. 使用loguru日志库,将不常见的【TRACE】级别作为保存中间数据的日志记录
  2. 以dict的方式保存日志,明确keyvalue保存
  3. 按照保存【TRACE】日志的格式format对应的pattern解析日志即可

pattern与日志的关系可以参考:python使用patterns解析loguru日志,从日志中提取结构化数据

示例代码

1. 源程序中这样保存中间结果

from loguru import logger

def use_func(num_1, num_2):
    result = num_1 * (num_2 + 2)
    logger.trace({ # 记录操作
        "函数名": "use_func",
        "value_1": num_1,
        "value_2": num_2,
        "result": result,
    })
    return result

def main():
    # 初始化日志
    logger.add("my_cal_record.log", filter=lambda record: "TRACE" in record['level'].name, level="TRACE",
               format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {message}", enqueue=True, mode='w')
    # 这里我们执行一个循环操作
    for i in range(40):
        use_func(i, i * 2)


if __name__ == '__main__':
    main()

2. 解析中间结果并导出

得到日志结果my_cal_record.log

2022-12-08 16:30:11.727 TRACE {'函数名': 'use_func', 'value_1': 0, 'value_2': 0, 'result': 0}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 1, 'value_2': 2, 'result': 4}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 2, 'value_2': 4, 'result': 12}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 3, 'value_2': 6, 'result': 24}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 4, 'value_2': 8, 'result': 40}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 5, 'value_2': 10, 'result': 60}
2022-12-08 16:30:11.728 TRACE {'函数名': 'use_func', 'value_1': 6, 'value_2': 12, 'result': 84}
......

用如下程序解析:

import pandas as pd
from loguru import logger
import dateutil
from dateutil.parser import parser

pattern = r"(?P<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3}) (?P<level>TRACE) (?P<message>.*)"
caster_dict = dict(time=dateutil.parser.parse, level=str)

record_list = []
for log_groups in logger.parse("my_cal_record.log", pattern, cast=caster_dict):
    record_list.append(eval(log_groups['message']))
print(pd.DataFrame(record_list))

可以得到中间结果的记录:

         函数名  value_1  value_2  result
0   use_func        0        0       0
1   use_func        1        2       4
2   use_func        2        4      12
3   use_func        3        6      24
4   use_func        4        8      40
......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python通过日志loguru记录程序中的中间变量,同时导出并分析 的相关文章

随机推荐

  • RKNN-ToolKit2 1.5.0安装教程

    引言 由于种种原因需要用到开发版RK3568 需要预先安装RKNN Toolkit2进行模型转化等 博主安装的版本是1 5 0 Ubuntu版本是20 04 python版本3 6 一 虚拟环境创建 1 为了隔离环境 我们采用conda创建
  • C++网络编程

    文章目录 网络通信socket 网络通信的过程 C 网络编程常用API 客户端网络通信过程与常用API 1 创建套接字 int socket int family int type int protocol 2 客户端请求连接函数 int
  • 软考考点之数据库关系运算符含义的理解

    如 2018上半年 第70题 给定关系 R A B C D E 与S B C F G 那么与表达式 2 4 6 7 2 lt 7 R S 等价的SQL语句 如下 SELECT 69 FROM R S WHERE 70 69 A R B D
  • springboot启动三部曲(Eclipse)

    开始前准备事项 JDK Eclipse Maven安装 一 创建maven项目 创建完成后项目目录如下 x
  • 解决uni.getLocation用户端首次拒绝后,点第二次不会再调用的问题

    解决方案 给与用户手动指引开启手机定位 效果 测试机为iphone11 机型不一样可能效果会有差别
  • pandas 实现 Excel 常见操作 (2)

    接下来介绍 pandas 的基本操作中 大体相当于 Excel 的合计 小计 subtotal 和数据透视表的方法 pandas 的数据统计功能比 Excel 强大很多 方式也更加灵活 Excel 问题之一就是数据的存储和显示不分离 而 p
  • 今夜科技谈

    我们希望 AI 能越来越聪明 但又害怕它们过于聪明 AlphaCode 超半数程序员的自主编程 AI 2 月 2 日 DeepMind 在官方博客中 介绍了他们最新的研发成果 AlphaCode AlphaCode 是一个可以自主编程的系统
  • Spring入门:IOC和DI (基于XML)

    目录 Spring的IOC ApplicationContext的三个常用实现类 ApplicationContext与BeanFactory的区别 Spring管理Bean的细节 1 创建Bean的三种方式 方式1 默认构造函数创建 方式
  • Gooey使用python打包后,print不能输出到GUI的命令行窗口内的问题解决

    为了给自己的图片接口站api horosama com补充图片 写了个壁纸爬虫程序 同时用Gooey做了个简单的GUI 然而 程序在vscode里直接运行的时候 是可以print函数输出到GUI的命令行窗口的 用pyinstaller打包之
  • QT QLine 使用详解

    本文详细的介绍了QLine控件的各种操作 例如 新建界面 源文件 设置属性 设置宽度 最小宽度 样式表 其它文章等等操作 实际开发中 一个界面上可能包含十几个控件 手动调整它们的位置既费时又费力 QLine表示平面上整数精度的二维向量 用于
  • Mybatis获取自动增长Id

    Mybatis获取自动增长Id MyBatis成功插入后获取自动增长的id 1 向xxMapping xml配置中加上两个配置
  • 基于51单片机温度控制风扇转动

    基于51单片机温度控制风扇转动 实验是在郭天祥老师的51单片机实验教程上做的改动 实验要求 数码管上显示的温度大于要求的温度时 这里设定是34度 风扇转动 实验步骤 1 温度传感器获得温度 2 对数据进行处理 3 把温度显示到数码管上 4
  • Tcl/TK基础语法学习(三)---字符串

    字符串基本用法 字符串表示 指定重复次数 string repeat 指定字符类型 sting is 返回 0 1 字符串长度 string length 包括空格 索引值 字符索引string index 字符获取 sring range
  • WebDriver介绍

    什么是Selenium 和WebDriver Selenium是一个浏览器自动化操作框架 Selenium主要由三种工具组成 第一个工具SeleniumIDE 是Firefox的扩展插件 支持用户录制和回访测试 录制 回访模式存在局限性 对
  • 蓝牙之十一 AVRCP协议

    Profile简介 AVRCP子协议的作用是支持CT控制TG 具体来说如果手机和一个蓝牙音箱设备连接上了 那么音箱可以控制手机播放 暂停 切歌以及获得手机上播放歌曲的信息 如专辑 歌名 歌手 时长等信息 iphone对信息获取支持较为完善
  • mac去除dmg打开密码的方法

    由于使用osx 系统 经常会访问到很多网站下载的dmg都会有密码 特别是风云社区上面的几千款免费精品Mac软件 社区地址如下 每次操作起来还是挺麻烦的 所以我们得去除这个密码 毕竟作为一个开发者不管是写代码还是电脑使用都得高效 一 打开di
  • socket通信中的几个重要结构体定义

    struct sockaddr unsigned short sa family 地址类型 AF xxx char sa data 14 14字节的端口和地址 struct sockaddr in short int sin family
  • CentOs7静默安装oracle11

    我们安装几个必要的工具 yum y install vim yum y install unzip yum y install lrzsz yum y update 先装这几个 安装Oracle11GR2所需要的依赖包 我们准备以下软件 l
  • Oracle 体系结构

    体系结构包括实例 SGA 后台进程 数据库文件 用户进程和服务器进程以及其他文件 如参数文件密码文件和归档日志文件等 1 物理结构 文件组成 数据文件 数据库操作中数据的最终存储位置 控制文件 验证数据库完整性 重做日志文件 在发生故障时用
  • Python通过日志loguru记录程序中的中间变量,同时导出并分析

    文章目录 思路 示例代码 1 源程序中这样保存中间结果 2 解析中间结果并导出 在程序运行的时候除了密密麻麻的日志外 这些关键函数的输入输出也十分重要 是回溯与数据核对的唯一 思路 使用loguru日志库 将不常见的 TRACE 级别作为保