在Nginx+Docker环境中如何定位Django日志?
问题描述
我的网站基于以下技术栈构建:
Django GraphQL Postgres Nginx Docker
我的docker-compose文件配置如下:
version: "3.9" services: web: extra_hosts: - "host.docker.internal:host-gateway" build: context: . dockerfile: Dockerfile.prod command: gunicorn sports_league.wsgi:application --bind 0.0.0.0:8000 volumes: - .:/code - static_volume:/code/staticfiles - media_volume:/code/mediafiles environment: - PRODUCTION=true env_file: - ./config/.env.prod expose: - 8000 nginx: build: ./nginx ports: - "80:80" depends_on: - web volumes: - static_volume:/code/staticfiles - media_volume:/code/mediafiles volumes: pgdata: static_volume: media_volume:
本地运行Django应用时,终端能看到print语句的日志,但通过Docker作为服务运行时,容器日志里找不到这些内容,Nginx容器日志里也没有。我的Nginx配置文件如下:
upstream sports_league { server web:8000; } server { listen 80; location / { proxy_pass http://sports_league; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; client_max_body_size 100M; } location /static/ { alias /code/staticfiles/; } location /media/ { alias /code/mediafiles/; } }
排查与解决方法
1. 直接查看web容器的日志
print语句的输出不会出现在Nginx容器日志里,要查看web服务容器的日志,执行以下命令:
# 实时查看web容器日志 docker-compose logs -f web # 查看web容器所有历史日志 docker-compose logs web
2. 强制gunicorn输出日志到标准流
gunicorn默认可能将日志重定向到文件,修改docker-compose中web服务的启动命令,强制将日志输出到标准输出/错误流,确保Docker能捕获:
command: gunicorn sports_league.wsgi:application --bind 0.0.0.0:8000 --access-logfile - --error-logfile -
其中--access-logfile -表示将访问日志输出到标准输出,--error-logfile -表示将错误日志输出到标准错误流,print语句的内容会被包含其中。
3. 改用Django官方日志系统替代print
生产环境不建议用print输出日志,配置Django日志系统能更稳定地收集日志:
在Django的settings.py中添加日志配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'INFO', }, }
之后把代码里的print替换成logger.info()(或对应级别日志),日志会直接输出到容器标准输出,通过docker-compose logs web即可查看。
4. 检查Docker日志驱动配置
如果以上方法无效,检查Docker容器的日志驱动是否被自定义配置影响:
docker inspect <web-container-id> | grep LogDriver
若不是默认的json-file驱动,可在docker-compose中为web服务指定日志驱动:
services: web: # 其他配置... logging: driver: "json-file"
内容的提问来源于stack exchange,提问作者Kalpesh Tawde
相关产品推荐
相关产品推荐

