【问题标题】:set default logging extra for python's Logger object为 python 的 Logger 对象设置默认日志记录
【发布时间】:2020-10-14 18:05:10
【问题描述】:

在 python 的内置日志模块中,您可以创建一个记录器并记录消息:

import logging
log = logging.getLogger('mylogger')
log.info('starting!')

您还可以将 extra 传递给稍后将由格式化程序使用的日志消息:

user = 'john doe'
log.info('starting!', extra={'user': 'john doe'})

但是,对每条消息都明确地执行此操作非常乏味。是否可以为整个记录器设置附加值,以便每个日志都传递它们?

类似:

log = logging.getLogger('mylogger')
log.extras = {'user': 'john doe'}
log.info('starting!')

目前似乎唯一的方法是猴子补丁log() 方法:

def patch_default_extras(logger, extras):
    original_log = logger.log

    def log_with_extras(level, msg, *args, **kwargs):
        kwargs['extra'] = {**extras, **kwargs.get('extra', {})}
        return original_log(level, msg, *args, **kwargs)

    logger.log = log_with_extras


mylog = logging.getLogger('mylogger')
patch_default_extras(mylog, {'user': 'john doe'})
mylog = logging.getLogger('mylogger')
mylog.log(logging.ERROR, 'hello')

这是相当丑陋的,但除非我错过了什么——这是唯一的方法?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    执行此操作的内置方法是使用logging adapter。过滤器也可以,但对于您描述的用例适配器是完美的。

    import logging
    
    logging.basicConfig(level=logging.DEBUG, format='user: %(user)s - message: %(msg)s')
    
    logger = logging.getLogger()
    logger_with_user = logging.LoggerAdapter(logger, {'user': 'jane doe'})
    
    logger_with_user.info('test') # user: jane doe - message: test
    

    【讨论】:

    • 完美!日志模块似乎非常强大,但有时几乎无法理解;谢谢!
    • 这确实是一个很好的解决方案。我想知道是否有办法传递像logger_with_param.info('the log message', user="Jane") 这样的参数
    • @lowercase00 如果您想传入值,您将在没有适配器的情况下使用记录器:logger.info('the log message', extra={'user':'Jane'})。您可以同时使用loggerlogger_with_user,具体取决于您希望用户自动填充或显式传入的时间。
    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2014-04-17
    • 2016-11-02
    • 2013-04-28
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多