django日志记录根据请求全局设置上下文?

Dhr*_*hak 22 python django logging

可以说我想像这个格式化字符串一样记录:

%(levelname)s %(asctime)s %(module)s %(funcName)s %(message)s %(user_id)
Run Code Online (Sandbox Code Playgroud)

可以使用这种类型的日志记录命令来完成:

logging.error('Error fetching information', extra = { 'user_id': 22 } )

这会将当前用户ID添加到当前请求的日志消息中.

但额外的dict需要添加到每个日志记录调用.

是否有一种很好的方法可以在django中的公共函数中添加此上下文(例如,中间件或视图的索引函数),以便设置具有用户ID的额外字典,并且当前请求中的所有进一步日志记录调用也会记录当前用户.

maw*_*awi 8

https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py上存在一个ThreadLocal中间件,它可以帮助您解决在任何地方提供当前请求的问题.

所以你需要做的是将中间件添加到MIDDLEWARE_CLASSES设置中,并在这样的地方创建一个函数:

 from django_tools.middlewares import ThreadLocal
 def log_something(levelname, module, funcname, message):
     user = ThreadLocal.get_current_user()
     # do your logging here. "user" is the user object and the user id is in user.pk
Run Code Online (Sandbox Code Playgroud)