DEBUG=False时Docker容器中Gunicorn运行Django无日志输出问题
问题描述
将Django应用容器化部署至Kubernetes,使用Kubernetes负载均衡器无需Nginx,已编写如下Dockerfile:
FROM python:3.11-alpine WORKDIR /usr/src/app COPY requirements.txt ./ RUN apk add musl-dev mariadb-dev gcc RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN python manage.py collectstatic CMD ["gunicorn" , "--bind", "0.0.0.0:8000", "app.wsgi"]
设置DEBUG = False后,运行容器仅能看到Gunicorn启动日志:
datetime [datetime] [1] [INFO] Starting gunicorn 20.1.0 datetime [datetime] [1] [INFO] Listening at: http://0.0.0.0:80 (1) datetime [datetime] [1] [INFO] Using worker: sync datetime [datetime] [1] [INFO] Booting worker with pid: 7
已配置默认日志:
LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": { "console": { "class": "logging.StreamHandler", }, }, "root": { "handlers": ["console"], "level": "INFO", }, }
但无法看到Django的访问、错误等日志,需补充哪些配置?
解决方案
- 修改Gunicorn启动参数,转发请求/错误日志到标准输出
Gunicorn默认不会将请求日志传递给Django,需要显式指定日志输出位置。更新Dockerfile中的CMD:
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--access-logfile", "-", "--error-logfile", "-", "app.wsgi"]
其中-表示将日志输出到stdout,和Django的console handler输出一致,方便容器日志统一收集。
- 补充Django特定日志器配置
默认root日志器可能未覆盖Django内置的请求/错误日志源,需要在LOGGING配置中添加针对django.request和django.server的日志规则:
LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": { "console": { "class": "logging.StreamHandler", }, }, "root": { "handlers": ["console"], "level": "INFO", }, "loggers": { # 记录请求错误(如404、500) "django.request": { "handlers": ["console"], "level": "INFO", "propagate": False, }, # 记录服务端请求日志(若使用Gunicorn,主要依赖Gunicorn的access-log) "django.server": { "handlers": ["console"], "level": "INFO", "propagate": False, }, }, }
propagate: False避免日志被重复输出到root日志器若需要更详细日志,可将
level改为DEBUG,生产环境建议保持INFO或WARNING验证日志输出
重新构建镜像并部署到Kubernetes后,使用kubectl logs <你的Pod名称>查看容器日志,即可看到Django的错误日志和Gunicorn转发的请求日志。
内容的提问来源于stack exchange,提问作者IdanB
相关产品推荐
相关产品推荐

