You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django配合Gunicorn+Nginx部署后生产日志无请求记录问题

问题根因

  • 你在runserver模式下看到的basehttp.py输出的请求日志,是Django自带开发服务器的独有功能。生产环境使用Gunicorn作为WSGI服务器时,请求接入逻辑由Gunicorn处理,这部分默认不会流入Django的日志体系。
  • 你当前的日志配置中,django、django.request日志器仅绑定了console处理器,而console处理器配置了require_debug_true过滤器,生产环境DEBUG=False时,这部分日志不会输出到文件。
  • Django原生的django.request日志器默认仅记录4xx、5xx级别的请求错误,不会记录2xx、3xx等正常访问的日志。

解决方案

方案1:添加Django自定义中间件(推荐,可完美匹配你需要的日志格式)

  1. 首先调整LOGGING配置,补全日志器的处理器绑定:
LOGGING = {
    # 原有配置保持不变,仅修改loggers部分即可
    "loggers": {
        "django": {
            "handlers": ["console", "production", "development"],
            "propagate": False,
        },
        "py.warnings": {
            "handlers": ["console", "production", "development"],
        },
        "django.request": {
            "handlers": ["console", "production", "development"],
            "level": "INFO",
            "propagate": False,
        },
        "task_logger": {
            "handlers": ["task_handler"],
            "level": "INFO",
            "propagate": False,
        },
        # 新增自定义请求日志器
        "request_access_logger": {
            "handlers": ["production", "development"],
            "level": "INFO",
            "propagate": False,
        }
    },
    # root配置保持不变
}
  1. 在你的Django应用目录下新建middleware.py文件,添加请求日志中间件:
import logging

logger = logging.getLogger("request_access_logger")

class RequestAccessLogMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        # 日志格式完全对齐你给出的示例
        log_msg = f'"{request.method} {request.path} HTTP/{request.META.get("SERVER_PROTOCOL", "1.1")}" {response.status_code} {len(response.content)}'
        logger.info(log_msg)
        return response
  1. 将中间件添加到settings.py的MIDDLEWARE列表最顶部:
MIDDLEWARE = [
    "你的应用名称.middleware.RequestAccessLogMiddleware",
    # 原有其他中间件保持不变
]

方案2:直接配置Gunicorn访问日志

无需修改Django代码,启动Gunicorn时添加如下参数即可,将Gunicorn的访问日志直接写入你需要的文件:

gunicorn 你的项目名.wsgi:application \
  --access-logfile /你的项目绝对路径/logs/production.log \
  --access-logformat '%(asctime)s INFO : gunicorn line - 0 : "%(method)s %(path)s %(protocol)s" %(status)s %(body_bytes_sent)s'

注意事项

配置完成后请确认Gunicorn运行的系统用户对项目下的logs目录有读写权限,避免权限不足导致日志写入失败。

内容的提问来源于stack exchange,提问作者Adnan Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 00:42:02