【问题标题】:python logging.Logger: overriding makeRecordpython logging.Logger:覆盖makeRecord
【发布时间】:2018-06-12 17:54:01
【问题描述】:

我有一个格式化程序,它需要记录中的特殊属性“user_id”,但并不总是存在(有时我使用特殊的 logging.Filter 将它添加到记录中)。 我试图像这样覆盖 logging.Logger 的 makeRecord 方法:

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)-15s user_id=%(user_id)s %(filename)s:%(lineno)-15s: %(message)s')


class OneTestLogger(logging.Logger):
    def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
        rv = logging.Logger.makeRecord(self, name, level, fn, lno,
                                       msg, args, exc_info,
                                       func, extra)
        rv.__dict__.setdefault('user_id', 'master')
        return rv


if __name__ == '__main__':

    logger = OneTestLogger('main')
    print logger
    logger.info('Starting test')

但这似乎不起作用,我不断得到:

ma​​in.MyLogger 实例位于 0x7f31a6a5b638>

找不到记录器“main”的处理程序

我做错了什么? 谢谢。

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    遵循Logging Cookbook 中提供的指南。只是第一部分,我没有实现过滤器(也没有出现在下面的引用中)。

    这通常意味着如果您需要对 LogRecord 执行任何特殊操作,则必须执行以下操作之一。

    1. 创建您自己的 Logger 子类,它会覆盖 Logger.makeRecord(),并在实例化您关心的任何 logger 之前使用 setLoggerClass() 设置它。

    我已经简化了您的示例,只是添加了“主机名”:

    import logging
    from socket import gethostname
    
    logging.basicConfig(level=logging.DEBUG,
                                format='%(asctime)s - %(hostname)s - %(message)s')
    
    class NewLogger(logging.Logger):
        def makeRecord(self, *args, **kwargs):
            rv = super(NewLogger, self).makeRecord(*args, **kwargs)
            # updating the rv value of the original makeRecord
            # my idea is to use the same logic than a decorator by
            # intercepting the value return by the original makeRecord
            # and expanded with what I need
            rv.__dict__['hostname'] = gethostname()
            # by curiosity I am checking what is in this dictionary
            # print(rv.__dict__)
            return rv
    
    logging.setLoggerClass(NewLogger)
    
    logger = logging.getLogger(__name__)
    logger.info('Hello World!')
    

    请注意,此代码适用于 python 2.7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2020-06-16
      • 2012-02-01
      • 2011-10-17
      相关资源
      最近更新 更多