首页 > 解决方案 > Python 日志记录 - 覆盖“记录”中的 args/msg 以避免更改为可变对象数据

问题描述

有没有一种方法可以使用编辑类来实现 Python 日志过滤器,使得任何使用参数记录消息的调用(例如 LOGGER.debug('my message, %s, %s', data1, data2) 都使用msg 和 args 的副本而不是传递的可变对象?我们的实现意味着日志编辑类最终会更改可变数据,然后将这些数据与编辑字符串一起存储/发送。我知道我们可以在调用记录器时执行此操作例如 LOGGER.debug('my message, %s, %s', copy.deepcopy(data1), copy.deepcopy(data2)),但希望有一种方法可以覆盖“记录”的过滤函数 resposnbile “在日志记录设置定义中?

标签: pythonlogging

解决方案


您必须覆盖该makeRecord功能。到应用过滤器时,记录已经创建。

import logging
import copy

class CopyLogger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
        args = copy.deepcopy(args) # <- this is the line you care about
        return super().makeRecord(name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)

logging.setLoggerClass(CopyLogger)
log = logging.getLogger('mylogger')

data1 = 'hello'
data2 = 'world'
log.warning('my message, %s, %s', data1, data2)

推荐阅读