FastAPI+Uvicorn日志着色对齐配置问题求助
解决方案
问题分析
你遇到的两个核心问题:
- 日志等级未按要求对齐,颜色单一
- 日志重复输出,原因是自定义日志处理器与Uvicorn默认日志处理器重复生效,且日志向上传播到父Logger导致重复打印
实现步骤
1. 自定义带颜色的对齐格式化器
创建支持不同等级颜色、自动对齐的Formatter类,解决等级对齐和颜色需求:
import logging class ColoredAlignedFormatter(logging.Formatter): # 不同日志等级对应终端颜色 LEVEL_COLORS = { logging.DEBUG: "\033[36m", # 青色 logging.INFO: "\033[32m", # 绿色 logging.WARNING: "\033[33m", # 黄色 logging.ERROR: "\033[31m", # 红色 logging.CRITICAL: "\033[35m" # 紫色 } RESET_CODE = "\033[0m" def format(self, record): # 获取当前等级对应的颜色 color = self.LEVEL_COLORS.get(record.levelno, self.RESET_CODE) # 等级左对齐,加上冒号后,计算需要补充的空格数,确保等级+冒号+空格总显示宽度为10(对齐内容) level_display = f"{color}{record.levelname}{self.RESET_CODE}:" # 计算需要补充的空格:目标总宽度10 - 等级+冒号的显示长度 space_needed = 10 - len(record.levelname) - 1 # 拼接成对齐后的等级前缀 aligned_level = f"{level_display}{' ' * space_needed}" # 替换日志记录中的等级字段 record.levelname = aligned_level # 调用父类方法完成剩余格式化 return super().format(record)
2. 统一配置所有相关Logger
同时配置Uvicorn核心Logger和业务Logger,清除默认处理器并关闭日志传播,解决重复输出问题:
# 创建日志处理器并绑定自定义格式化器 stream_handler = logging.StreamHandler() stream_handler.setFormatter(ColoredAlignedFormatter("%(levelname)s%(message)s")) # 配置Uvicorn相关Logger(覆盖默认配置) uvicorn_logger_names = ["uvicorn", "uvicorn.error", "uvicorn.access"] for logger_name in uvicorn_logger_names: logger = logging.getLogger(logger_name) logger.handlers.clear() # 移除Uvicorn默认处理器 logger.addHandler(stream_handler) logger.setLevel(logging.INFO) logger.propagate = False # 禁止日志向上传播到父Logger # 配置你的业务Logger app_logger = logging.getLogger(__name__) app_logger.handlers.clear() app_logger.addHandler(stream_handler) app_logger.setLevel(logging.INFO) app_logger.propagate = False
效果说明
配置完成后,日志会呈现如下样式:
INFO: Application startup complete. WARNING: StatReload detected changes in 'ethjsonrpc/main.py'. Reloading... INFO: Shutting down INFO: ✅ Devnet running in background
- 不同等级显示对应颜色
- 等级左对齐,冒号后自动补空格,确保日志内容起始位置一致
- 无重复日志输出
内容的提问来源于stack exchange,提问作者ClementWalter
相关产品推荐
相关产品推荐

