假设我想记录如下格式化字符串:
%(levelname)s %(asctime)s %(module)s %(funcName)s %(message)s %(user_id)
可以使用这种类型的日志记录命令来完成:
logging.error('Error fetching information', extra = { 'user_id': 22 } )
这将向当前请求的日志消息中添加当前用户标识。在
但是额外的dict需要添加到每个日志记录调用中。在
在django中的一个公共函数(例如中间件,或者视图的索引函数)中,有没有一个好的方法来添加这个上下文,这样就设置了带有用户id的额外字典,并且当前请求中所有进一步的日志记录调用也会记录当前用户。在
这里有一种没有线程局部变量或中间件的可能方法:在
views.py
中,有一个dict映射线程到请求,并有一个锁来序列化对它的访问:创建以下筛选器并附加到需要输出请求特定信息的处理程序:
^{pr2}$然后,作为每个视图的第一个语句,在映射中设置请求:
使用此设置,您应该会发现日志输出包含相关的请求特定信息。在
在https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py上存在一个ThreadLocal中间件,它可以帮助您解决当前请求在任何地方都可用的问题。在
因此,您需要做的是将中间件添加到您的中间件类设置中,并在某个地方创建一个函数,如下所示:
我想你在找一个custom log formatter。结合mawimawi给出的包含threadlocal信息的答案,format方法可以自动获取这些信息并将其添加到每个记录的消息中。在
有两件事需要考虑:首先,如果以使用线程池的方式进行部署,那么threadlocal变量可能是危险的,更糟糕的是,泄漏信息。其次,在编写格式化程序时需要谨慎,以防在没有threadlocal信息的上下文中调用它。在
相关问题 更多 >
编程相关推荐