如何在Django+Gunicorn应用的标准输出中打印请求用户信息
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
- 未授权请求:在状态码后显示
UNAUTHORIZED,示例:
[03.10.2022 19:43:14] INFO [django.request:middleware] GET /analyse/v2/ping - 200 - UNAUTHORIZED
实现步骤
在Django项目的settings.py中添加以下配置:
1. 定义日志过滤器回调函数
该函数用于从请求中提取用户信息,无有效用户时标记为未授权:
def add_username(record): try: # 若需显示邮箱,替换为 record.request.user.email username = record.request.user.username except AttributeError: username = "UNAUTHORIZED" record.username = username return True
2. 配置LOGGING字典
将过滤器绑定到日志处理器,调整输出格式以匹配需求:
LOGGING = { "version": 1, "disable_existing_loggers": True, "root": {"level": "WARNING", "handlers": ["console"]}, "formatters": { "verbose": { "format": "[%(asctime)s] %(levelname)s [%(name)s:%(module)s] %(message)s - %(username)s", "datefmt": "%d.%m.%Y %H:%M:%S", }, "simple": {"format": "%(levelname)s %(message)s"}, }, "filters": { "add_username": { "()": "django.utils.log.CallbackFilter", "callback": add_username, } }, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "verbose", "filters": ["add_username"], }, # 可按需添加文件处理器等其他日志输出方式 }, "loggers": { "django.request": { "handlers": ["console"], "level": "INFO", "propagate": False, }, # 可给其他需要的日志器绑定该过滤器 } }
注意事项
- Gunicorn会直接复用Django的日志配置,启动时无需额外修改Gunicorn日志参数
- 确保日志记录的
record对象包含request属性(Django的django.request日志器默认会携带)
内容的提问来源于stack exchange,提问作者Cospel
相关产品推荐
相关产品推荐

