如何修改Uvicorn日志样式?基于FastAPI开发Discord API封装场景
自定义Uvicorn日志样式的解决方案
Uvicorn基于Python标准logging模块实现日志,不用替换成rich、loguru这类独立日志库,直接通过自定义Formatter和修改Uvicorn的日志配置就能适配需求。
步骤1:自定义日志Formatter
写一个继承自logging.Formatter的类,根据需求定义日志输出格式,比如添加颜色、自定义字段:
import logging class CustomUvicornFormatter(logging.Formatter): # 定义日志级别对应的颜色转义码 COLOR_MAP = { logging.DEBUG: '\033[94m', # 蓝色 logging.INFO: '\033[92m', # 绿色 logging.WARNING: '\033[93m', # 黄色 logging.ERROR: '\033[91m', # 红色 logging.CRITICAL: '\033[95m' # 紫色 } RESET_CODE = '\033[0m' def format(self, record): # 给日志级别添加颜色 color = self.COLOR_MAP.get(record.levelno, self.RESET_CODE) record.levelname = f"{color}{record.levelname}{self.RESET_CODE}" # 自定义日志输出格式,可按需调整字段 fmt = "%(asctime)s | %(levelname)s | %(name)s | %(message)s" formatter = logging.Formatter(fmt, datefmt="%Y-%m-%d %H:%M:%S") return formatter.format(record)
步骤2:替换Uvicorn的日志Formatter
在启动FastAPI应用时,获取Uvicorn的日志Handler,替换成自定义的Formatter:
from fastapi import FastAPI import uvicorn import logging app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} def setup_uvicorn_logging(): # 获取Uvicorn核心日志器和访问日志器 uvicorn_logger = logging.getLogger("uvicorn") uvicorn_access_logger = logging.getLogger("uvicorn.access") # 遍历所有Handler,替换为自定义Formatter for logger in [uvicorn_logger, uvicorn_access_logger]: for handler in logger.handlers: handler.setFormatter(CustomUvicornFormatter()) if __name__ == "__main__": # 先配置日志,再启动Uvicorn setup_uvicorn_logging() uvicorn.run(app, host="0.0.0.0", port=8000)
额外说明
- 如果需要输出结构化日志(比如JSON格式),只需修改
CustomUvicornFormatter的format方法,用json.dumps将日志字段序列化为JSON即可。 - 不要直接替换Uvicorn的logger或Handler,避免破坏原有日志逻辑,仅替换Formatter是最安全的适配方式。
- 若通过命令行启动Uvicorn,可在启动脚本中先执行日志配置代码,再调用Uvicorn的启动函数。
内容的提问来源于stack exchange,提问作者DARK FLAME YT
相关产品推荐
相关产品推荐

