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

如何为Python简单logging模块的不同日志级别配置不同颜色

如何为Python简单logging模块的不同日志级别配置不同颜色

我最近写了一段简单的Python日志脚本:

import logging
import sys

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)
    print("This is a normal print statement", file=sys.stdout)
    logging.debug("debug message")
    logging.info("info message")
    logging.warning("warning message")

原本我以为INFO级别的日志颜色会和print的输出(sys.stdout)一样,至少是个中性色,但实际运行后发现INFO日志居然是红色的,看起来特别刺眼,整个日志可读性变得很差。我试过添加格式配置:

logging.basicConfig(level=logging.DEBUG,  format="%(asctime)s - %(levelname)s - %(message)s")

但这完全没改变颜色。我不想为项目搞复杂的logger配置,就想用最基础的logging模块,请问有没有简单的办法调整不同日志级别的颜色呢?


其实不用复杂配置,我们可以通过自定义一个格式化器(Formatter)来为不同日志级别设置颜色,依然用基础的logging根logger就行,非常方便:

import logging
import sys

# 定义不同日志级别对应的终端颜色ANSI码
COLOR_MAP = {
    logging.DEBUG: '\033[94m',    # 蓝色
    logging.INFO: '\033[92m',     # 绿色(和print默认颜色接近,想完全一致可以改成'\033[0m')
    logging.WARNING: '\033[93m',  # 黄色
    logging.ERROR: '\033[91m',    # 红色
    logging.CRITICAL: '\033[95m'  # 紫色
}
RESET_COLOR = '\033[0m'  # 重置颜色,避免后续输出带颜色

class ColoredLogFormatter(logging.Formatter):
    def format(self, record):
        # 拿到当前日志级别对应的颜色,没有就用默认重置色
        color = COLOR_MAP.get(record.levelno, RESET_COLOR)
        # 给级别名称加上颜色标记
        record.levelname = f"{color}{record.levelname}{RESET_COLOR}"
        # 调用父类的格式化方法输出最终日志
        return super().format(record)

if __name__ == "__main__":
    # 获取默认的根logger
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.DEBUG)
    
    # 先移除默认的handler,避免重复输出日志
    for handler in root_logger.handlers[:]:
        root_logger.removeHandler(handler)
    
    # 创建控制台输出handler,指定用stdout和我们的彩色格式化器
    console_handler = logging.StreamHandler(sys.stdout)
    log_formatter = ColoredLogFormatter("%(asctime)s - %(levelname)s - %(message)s")
    console_handler.setFormatter(log_formatter)
    
    # 把handler加回根logger
    root_logger.addHandler(console_handler)
    
    # 测试输出
    print("This is a normal print statement", file=sys.stdout)
    logging.debug("debug message")
    logging.info("info message")
    logging.warning("warning message")
    logging.error("error message")
    logging.critical("critical message")

说明:

  1. ANSI转义码是终端识别的颜色控制指令,\033[0m用来重置颜色,防止后续的输出也带上之前的颜色。
  2. 这里把INFO级别设为绿色,和print的默认输出色调接近,如果你想让它和print完全一样,把logging.INFO对应的颜色改成'\033[0m'(终端默认色)就行。
  3. 全程只用了根logger,没有创建额外的logger实例,完全符合你想要的“简单logging”使用习惯。
  4. 要是你的终端不支持ANSI颜色(这种情况很少见了),转义码会被当成普通字符显示,但不会影响日志内容本身。

备注:内容来源于stack exchange,提问作者fascynacja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:45:29