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

FastAPI+Uvicorn日志着色对齐配置问题求助

解决方案

问题分析

你遇到的两个核心问题:

  1. 日志等级未按要求对齐,颜色单一
  2. 日志重复输出,原因是自定义日志处理器与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:35:03