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

Max*_* L. 5 python flask

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

我想出了下面的解决方案,但它的hackish,因为它不允许格式字符串来驱动的格式user_id,而且由于记录API似乎提供了一些方法来定制日志(LoggerAdapter,logging.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
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

您可以定义为其注入值的自定义过滤器record.user_id.通过这种方式,您可以定义一种格式,其中包括%(user_id)s其他(标准)记录属性:

format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')
Run Code Online (Sandbox Code Playgroud)

然后所有日志记录调用将自动添加该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)
Run Code Online (Sandbox Code Playgroud)