Python 为tornado日志条目传递额外上下文
我们的日志格式化程序有一个用户定义的参数。其定义如下:Python 为tornado日志条目传递额外上下文,python,logging,tornado,Python,Logging,Tornado,我们的日志格式化程序有一个用户定义的参数。其定义如下: '%(asctime)s|%(levelname)s|%(name)s|REQID:%(req_id)s|%(module)s:%(lineno)s|%(message)s' 其中,req\u id是一个请求id,由应用程序代码为每个请求生成。当我们处理请求时,在我们的应用程序代码上,我们可以访问此req\u id,并将其用于如下记录目的: logger = logging.LoggerAdapter(logging.getLogger(
'%(asctime)s|%(levelname)s|%(name)s|REQID:%(req_id)s|%(module)s:%(lineno)s|%(message)s'
其中,req\u id
是一个请求id,由应用程序代码为每个请求生成。当我们处理请求时,在我们的应用程序代码上,我们可以访问此req\u id
,并将其用于如下记录目的:
logger = logging.LoggerAdapter(logging.getLogger(service_name), {'req_id': req_id})
logger.debug('A debug message')
我正在尝试使tornado logger符合我们的日志格式,但由于tornado无法访问我们的应用程序级别req\u id
,因此它会失败:
KeyError: 'req_id'
如何告诉tornado在用户提供的上下文中使用LoggerAdapter
来访问tornado.access
编辑
作为解决办法,我尝试了以下方法:
由于我无法告诉tornado要使用什么记录器,因此我设法绕过了这个限制,在每个请求中重新配置tornado记录器,并使用
不幸的是,为每个请求重新配置日志不起作用,因为tornado将并行地为请求提供服务,我们将得到一个不一致的状态
那么我们如何为tornado Logger传递用户上下文呢?可以通过在子类中重写或使用
log\u函数
应用程序设置来控制tornado.access
日志。此方法默认写入tornado.access
log,但您可以根据需要重写它以记录日志
但是请注意,tornado.general
和tornado.application
记录器不能以这种方式覆盖,因此日志格式化程序/筛选器必须仍然能够处理没有req\u id
字段的消息