如何在FastAPI服务中通过接口动态修改uvicorn的日志级别
解决方案
你之前修改全局
log_level变量不生效的原因很简单:uvicorn.run传入的log_level和yaml配置都是服务启动时的初始化参数,启动完成后再修改这两个地方不会对已经实例化的日志器产生任何影响,不需要更换日志库,直接操作Python标准库logging的运行时日志器实例即可实现动态调整。
具体实现逻辑
uvicorn默认基于Python标准logging库生成日志实例,启动后会创建两个核心日志器:
uvicorn.access:记录接口访问日志uvicorn.error:记录服务运行、框架报错日志
你只需要在接口中动态修改这两个日志器的级别,以及你自己业务代码用到的自定义日志器的级别即可。
完整实现代码
import logging from fastapi import FastAPI, HTTPException app = FastAPI() # 合法日志级别映射 VALID_LOG_LEVELS = { "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, "error": logging.ERROR, "critical": logging.CRITICAL } @app.put("/api/log/{level}") def change_log_level(level: str): level = level.lower() if level not in VALID_LOG_LEVELS: raise HTTPException( status_code=400, detail=f"无效日志级别,可选值:{list(VALID_LOG_LEVELS.keys())}" ) target_level = VALID_LOG_LEVELS[level] # 调整uvicorn核心日志器级别 logging.getLogger("uvicorn").setLevel(target_level) logging.getLogger("uvicorn.access").setLevel(target_level) logging.getLogger("uvicorn.error").setLevel(target_level) # 如果你自己的业务代码用了自定义命名的日志器,在这里同步调整即可,示例: # logging.getLogger("你的业务日志器名称").setLevel(target_level) # 可选:调整根日志器级别,覆盖所有未单独配置级别的子日志器 # logging.getLogger().setLevel(target_level) return {"status": "success", "current_log_level": level}
注意事项
- 如果你在开发阶段开启了
reload=True,代码变更触发服务重启后,日志级别会回到uvicorn.run初始化时的配置,生产环境关闭reload后,调整后的日志级别会持续生效直到服务重启。 - 如果需要重启后也保留修改后的日志级别,可以在修改级别时同步写入你的
logging.yaml配置文件,下次启动时读取配置文件中的级别即可。
内容的提问来源于stack exchange,提问作者Reine Baudache
相关产品推荐
相关产品推荐

