Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值相关的知识,希望对你有一定的参考价值。

在Flask应用程序中,每当user_id中存在user_id时,我想添加一个flask.session字段添加到生成的每个错误日志记录中。

我想出了下面的解决方案,但它是hackish,因为它不允许格式字符串驱动user_id的格式,并且因为日志记录API似乎提供了自定义日志记录的方法(LoggerAdapterlogging.makeRecord等...我认为必须有一个更清洁的方式。

这样做的“蟒蛇方式”是什么?

class CustomFormatter(Formatter):
    def format(self, record):
        from myapp.core import authenticationManager
        user_id = authenticationManager.current_user_id_if_authenticated()
        user_id = "unknown" if user_id is None else str(user_id)
        return super(F,self).format(record) + ", user_id" + user_id
答案

您可以定义a custom filter,它为record.user_id注入一个值。通过这种方式,您可以像其他(标准)记录属性一样定义包含%(user_id)s的格式:

format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')

然后所有日志记录调用将自动添加user_id值。


import logging

class UserIDFilter(logging.Filter):
    """
    This is a filter which injects contextual information into the log.
    """
    from myapp.core import authenticationManager

    def filter(self, record):
        user_id = authenticationManager.current_user_id_if_authenticated()
        user_id = "unknown" if user_id is None else str(user_id)
        record.user_id = user_id
        return True


logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')

logger = logging.getLogger(__name__)
filt = UserIDFilter()
logger.addFilter(filt)
另一答案

logaugmentGithub page)包执行此操作:

使用:

import logaugment

logaugment.set(logger, user_id='custom_value')

使用logger的所有日志记录调用现在将在日志消息中使用'custom_value'的值%(user_id)s

您可以反复调用logaugment.set而无需更改值。或者,您可以指定每次进行日志记录调用时将调用的可调用对象。这将允许动态计算/检索用户ID(参见README包中的示例)。

安装:

pip install logaugment

(免责声明:我开发了这个包)

以上是关于Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值的主要内容,如果未能解决你的问题,请参考以下文章

派生记录器中的 LogRecord 属性

Python之向日志输出中添加上下文信息

Python之向日志输出中添加上下文信息

Python / C-Api:向模块添加类

python日志处理

python logging模块