我们的日志格式化程序具有用户定义的参数。它被定义为:
'%(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')
我正在尝试使龙卷风记录器符合我们的日志格式,但由于龙卷风无法访问我们的应用程序级req_id
,因此失败了:
KeyError: 'req_id'
如何通过用户提供的上下文告诉龙卷风使用LoggerAdapter
tornado.access
?
作为解决方法,我尝试了以下方法:
由于我不可能告诉龙卷风使用什么记录器,我设法通过在每个请求中重新配置龙卷风记录器,使用logging filter添加上下文信息来解决这个限制。
不幸的是,由于龙卷风将并行处理请求,因此重新配置每个请求的日志不起作用,我们将得到一个不一致的状态。
我们如何为龙卷风记录器传递用户上下文呢?
答案 0 :(得分:0)
可以通过覆盖子类中的Application.log_request
或使用tornado.access
应用程序设置来控制log_function
日志。此方法默认为写入tornado.access
日志,但您可以根据需要将其覆盖为日志。
但请注意,tornado.general
和tornado.application
记录器无法以这种方式覆盖,因此您的日志格式化程序/过滤器仍必须能够处理不具有req_id
字段的消息