bounty将在6天后过期。回答此问题可获得+200声望奖励。Cospel正在寻找规范答案。
现在我的Django + Gunicorn应用程序只打印以下信息:
[03.10.2022 19:43:14] INFO [django.request:middleware] GET /analyse/v2/ping - 200
如果请求获得授权,我还想在状态代码后面显示用户(用户名/电子邮件),类似于:
[03.10.2022 19:43:14] INFO [django.request:middleware] GET /analyse/v2/ping - 200 - useremail@outlook.com
如果请求未授权,则填写“未授权”:
[03.10.2022 19:43:14] INFO [django.request:middleware] GET /analyse/v2/ping - 200 - UNAUTHORIZED
我如何才能通过Django和Gunicorn的组合实现这一点?
谢谢你
2条答案
按热度按时间gcuhipw91#
一个定制的中间件是你可以轻松实现这一点的方法。你可以做如下的事情。
然后,您可以通过注册来配置并激活新的中间件。
这将生成如下所示的输出。
u4dcyp6a2#
不清楚这行日志来自哪里。据我所知,Django只记录4xx和5xx对
django.request
logger的请求。这看起来也不像gunicorn访问日志行。如果你用自己的代码初始化这行日志,你应该可以很容易地添加用户。这里有几个通用的解决方案。
(选项1)对于gunicorn访问日志行
您没有访问Django的请求对象的权限,因此无法从gunicorn中检索用户,不过,您可以通过在响应头中添加用户来解决这个问题。
然后更改gunicorn的
access_log_format
设置以包含此头。'%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%({x-user}o)s"'
(选项2)用于
django.request
记录器如果您的日志行被发送到
django.request
记录器,则它有可能在额外的上下文中提供请求。在这种情况下,您可以编写一个自定义格式化程序来包含用户:
(选项3)告诉Django在
django.request
中记录所有请求Django只在
django.request
中记录4xx和5xx请求。但是我们可以通过使用自定义WSGI处理程序来更改此行为。
在 *yourproject/wsgi.py * 中,您应该有类似以下的内容:
您可以将其更改为使用自定义WSGI处理程序:
然后,参考选项2将用户包括在格式化程序中。
(选项4)创建中间件以添加新的日志行
如果没有访问此日志行的权限来更新它,并且没有访问日志格式化程序中的请求的权限,则必须手动添加新的日志行(并且可能将第一行静默以避免重复)。