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自定义中间件(推荐,可完美匹配你需要的日志格式)
- 首先调整
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配置保持不变 }
- 在你的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
- 将中间件添加到
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
相关产品推荐
相关产品推荐

