将自定义值传递给记录器而不是每条消息

时间:2016-09-02 06:58:56

标签: python python-3.x logging

我想记录用户会话。目前代码如下(省略设置格式化程序和处理程序):

logger = logging.getLogger("component")
logger.info("message", extra={"session": 123})
logger.debug("debug", extra={"session": 123})

如果要记录多条消息,每次发送此额外信息都很烦人。什么是最好/最干净/最pythonic的方式来实现这样的目标:

logger = logging.getLogger("component")
# for example:
logger.addExtra({"session": 123})
logger.info("message") # extra would be added automatically
logger.debug("debug") # extra would be added automatically

我可以考虑扩展记录器和覆盖日志记录方法。

4 个答案:

答案 0 :(得分:3)

创建LoggerAdapter指定为@DhruvPathak。根据{{​​3}}:

class logging.LoggerAdapter(logger, extra)

通过在初始化期间提供记录器实例和extra args来实现这一点:

logger = logging.LoggerAdapter(logger, extra)

答案 1 :(得分:1)

使用函数工厂,例如

def get_logger_with_context(name, context=None):
    extra = context or {}
    logger = logging.getLogger(name)

    def log(level, message, **kwargs):
        getattr(logger, level)(message, extra=context)

    return log

答案 2 :(得分:1)

这样的custom logging在python日志记录类中是可行的,使用logging.loggerAdapters来修改日志记录行为。

  

您可以通过简单的方式传递上下文信息以进行输出   与记录事件信息一起使用LoggerAdapter   类。这个类看起来像一个Logger,所以你可以   调用debug(),info(),warning(),error(),exception(),critical()和   登录()。这些方法与其中的对应方具有相同的签名   记录器,因此您可以互换使用这两种类型的实例。

答案 3 :(得分:0)

请参阅Python logging doc:在LogAdapter旁边,您也可以使用LogFilter。

我通常使用MDC因为影响所有记录器。不幸的是,Python日志记录没有MDC。我刚刚找到mdaniel's MDC gist