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
相关产品推荐
相关产品推荐

