文章目录
- 思路
- 示例代码
-
- 1. 源程序中这样保存中间结果
- 2. 解析中间结果并导出
在程序运行的时候除了密密麻麻的日志外,这些关键函数的输入输出也十分重要,是回溯与数据核对的唯一
思路
- 使用
loguru
日志库,将不常见的【TRACE】级别作为保存中间数据的日志记录 - 以dict的方式保存日志,明确
key
与value
保存 - 按照保存【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
......