【问题标题】:Passing extra context for tornado log entries为龙卷风日志条目传递额外的上下文
【发布时间】:2023-11-25 15:51:01
【问题描述】:

我们的日志格式化程序有一个用户定义的参数。定义为:

'%(asctime)s|%(levelname)s|%(name)s|REQID:%(req_id)s|%(module)s:%(lineno)s|%(message)s'

其中req_id 是一个请求ID,由应用程序代码为每个请求生成。当我们处理请求时,在我们的应用程序代码中,我们可以访问这个req_id,我们将它用于如下的日志记录目的:

logger = logging.LoggerAdapter(logging.getLogger(service_name), {'req_id': req_id})
logger.debug('A debug message')

我正在尝试使 tornado 记录器符合我们的日志格式,但由于 tornado 无法访问我们的应用程序级别 req_id 它失败了:

KeyError: 'req_id'

如何通过用户提供的上下文告诉 tornado 使用 LoggerAdapter 代替 tornado.access

编辑

作为一种解决方法,我尝试了以下方法:

由于我无法告诉 tornado 使用哪些记录器,因此我设法通过在每个请求中重新配置 tornado 记录器并使用 logging filter 添加上下文信息来解决此限制。

很遗憾,为每个请求重新配置日志不起作用,因为 tornado 将并行处理请求,我们将获得不一致的状态。

那么我们如何为龙卷风记录器传递用户上下文?

【问题讨论】:

    标签: python logging tornado


    【解决方案1】:

    tornado.access 日志可以通过在子类中覆盖 Application.log_request 或使用 log_function 应用程序设置来控制。此方法默认写入tornado.access 日志,但您可以根据需要覆盖它以进行日志记录。

    但是请注意,tornado.generaltornado.application 记录器不能以这种方式被覆盖,因此您的日志格式化程序/过滤器必须仍然能够处理没有 req_id 字段的消息。

    【讨论】: