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

Docker部署FastAPI仅捕获Error日志,Info日志丢失求助

问题分析

你当前的日志配置依赖gunicorn.error日志实例,但实际启动命令用的是uvicorn而非gunicorn,导致gunicorn.error并未初始化,FastAPI的logger实际继承了Python root logger的默认配置——root logger默认级别为WARNING,因此info级别的日志被过滤,仅error及以上级别日志能输出。

解决方案

方案1:适配Uvicorn启动的日志配置

修改logger.py,让FastAPI的logger复用Uvicorn的日志handler,同时确保Uvicorn本身的日志级别足够低:

import logging
from fastapi.logger import logger as fastapi_logger

# 获取uvicorn的日志实例,复用其handler
uvicorn_logger = logging.getLogger("uvicorn")
fastapi_logger.handlers = uvicorn_logger.handlers
# 设置FastAPI logger的级别为DEBUG
fastapi_logger.setLevel(logging.DEBUG)

def get_logger(name):
    return fastapi_logger

同时修改Dockerfile的启动命令,指定Uvicorn的日志级别为debug(避免Uvicorn的handler过滤info日志):

FROM python:3.11-slim

ENV REGISTRY_LOG_LEVEL=debug

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 80

# 添加--log-level debug参数
CMD ["python3.11", "-m", "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80", "--log-level", "debug"]

方案2:独立配置日志Handler(不依赖启动器)

如果不想绑定Uvicorn或Gunicorn的日志配置,可以直接创建独立的StreamHandler(Docker默认捕获stdout/stderr):

import logging
import os
from fastapi.logger import logger

# 从环境变量读取日志级别,默认debug
log_level = os.getenv("REGISTRY_LOG_LEVEL", "debug").upper()
target_level = getattr(logging, log_level, logging.DEBUG)

# 创建控制台Handler
handler = logging.StreamHandler()
handler.setLevel(target_level)
# 自定义日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)

# 避免重复添加Handler
if not logger.handlers:
    logger.addHandler(handler)
logger.setLevel(target_level)
# 禁止向root logger传播日志,避免重复输出
logger.propagate = False

def get_logger(name):
    return logger

这种方式无需修改Docker启动命令,直接通过环境变量REGISTRY_LOG_LEVEL控制日志级别即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:45:59