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

如何在Uvicorn/FastAPI中使用Python logging?日志失效问题排查

问题原因
  • Python标准logging模块的默认规则:自定义的mylogger默认没有绑定任何输出处理器(handler),而且默认日志级别是WARNING。你调用的logger.info()属于INFO级别,低于默认的WARNING,所以日志直接被过滤掉,不会输出。
  • Loguru是开箱即用的日志库,默认就配置了终端输出的handler,且默认级别是INFO,所以调用后能直接看到日志。
解决方法

下面两种方案都能让标准logging的日志正常输出,选一种就行:

方案1:给自定义logger配置handler和级别

修改启动事件里的代码,手动给mylogger添加控制台输出的handler,并设置合适的日志级别:

import fastapi
import logging
import loguru

instance = fastapi.FastAPI()

@instance.on_event("startup")
async def startup_event():
    logger = logging.getLogger("mylogger")
    logger.setLevel(logging.INFO)  # 把日志级别设为INFO,确保info级别的日志能通过
    
    # 添加控制台输出的handler,并设置日志格式
    console_handler = logging.StreamHandler()
    log_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    console_handler.setFormatter(log_formatter)
    logger.addHandler(console_handler)
    
    logger.info("I expect this to log")  # 现在这条日志会正常输出了
    loguru.logger.info("but only this logs")

方案2:让自定义logger继承Uvicorn的日志配置

你启动Uvicorn时指定了--log-level=debug,此时Uvicorn已经给根logger配置好了handler和级别。让自定义的mylogger继承根logger的配置即可,只需要确保它的级别不高于根logger的级别:

import fastapi
import logging
import loguru

instance = fastapi.FastAPI()

@instance.on_event("startup")
async def startup_event():
    logger = logging.getLogger("mylogger")
    logger.setLevel(logging.INFO)  # 级别低于Uvicorn的debug,就能继承根logger的输出
    # 不用手动加handler,会自动用根logger的配置
    logger.info("I expect this to log")
    loguru.logger.info("but only this logs")

补充说明

如果想让自定义logger的日志格式和Uvicorn保持一致,可以直接参考Uvicorn的默认日志格式来设置,或者复用它的formatter实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:22:15