自定义变量字段到python日志记录

时间:2017-03-31 15:57:13

标签: python class logging

我正在尝试在我的库中添加自定义格式字段。我知道这可以使用Filter或LoggerAdapter对象完成。但是,在我看到的示例中(如下所示:How do I add custom field to Python log format string?),他们想要生成的自定义字段是静态的,并且在创建记录器时是已知的。

我需要能够将一个变量发送到我的日志记录中,直到我写日志记录之前我才知道。我想我只是没有看到解决方案但是如何最好地完成这个?

目前我以这种方式设置我的记录器:

import logging

class MyClass:
    filehandler = logging.handlers.RotatingRileHandler(r'C:\Users\Me\Desktop\Logs', 
            maxBytes=1000000, backupCount=4, encoding='ASCII')
    formatter = logging.Formatter('[%(asctime)s] : %(levelname)-8s: Para: %(parameter)-15s'
                                  ' - %(message)s')
    # parameter is my custom name I want to inject
    self.logger = logging.getLogger(__name__)
    self.logger.setLevel(logging.DEBUG)
    self.logger.addHandler(file_handler)

    d = {'parameter': ''}
    self.logger = logging.LoggerAdapter(self.logger, extra=d)

在我的测试中,我写道:

my_obj = MyClass()
my_obj.logger.error('This is my error.', extra={'parameter': 'True'}

但这会使参数字段''(空字符串)始终存在。有没有办法在每次拨打日志时设置d字典(error()debug()等)?

1 个答案:

答案 0 :(得分:5)

我对此进行了进一步调查,LoggerAdapter的'extra'参数优先于实际日志操作中的'extra'参数。这也在documentation中描述。

要实现您的目标,您可以覆盖LoggerAdapter类并按如下方式自定义流程方法:

class CustomLoggerAdapter(logging.LoggerAdapter):

    def process(self, msg, kwargs):
        """
        Process the Logging message and keyword arguments passed in to
        a logging call to insert contextual information. The extra argument
        of the LoggerAdapter will be merged with the extra argument of the
        logging call where the logging call's argument take precedence.
        """
        try:
            kwargs["extra"] = {**self.extra, **kwargs["extra"]}
        except KeyError as e:
            kwargs["extra"] = self.extra
        return msg, kwargs

这会将LoggerAdapter的额外参数与日志记录调用的参数合并。记录调用的参数优先。