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

