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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:47:14