Python脚本如何输出彩色日志内容

wen python案例 27

本文目录导读:

Python脚本如何输出彩色日志内容

  1. 使用ANSI转义码(最基础方法)
  2. 使用colorlog库(推荐)
  3. 使用rich库(功能更强大)
  4. 高级示例:自定义彩色日志类
  5. Windows兼容方案
  6. 推荐选择

我来介绍几种在Python中输出彩色日志的方法:

使用ANSI转义码(最基础方法)

import logging
class ColoredFormatter(logging.Formatter):
    """自定义彩色日志格式器"""
    # ANSI颜色码
    COLORS = {
        'DEBUG': '\033[94m',     # 蓝色
        'INFO': '\033[92m',      # 绿色
        'WARNING': '\033[93m',   # 黄色
        'ERROR': '\033[91m',     # 红色
        'CRITICAL': '\033[95m',  # 紫色
    }
    RESET = '\033[0m'
    def format(self, record):
        log_color = self.COLORS.get(record.levelname, self.RESET)
        message = super().format(record)
        return f"{log_color}{message}{self.RESET}"
# 设置日志
handler = logging.StreamHandler()
handler.setFormatter(ColoredFormatter('%(asctime)s - %(levelname)s - %(message)s'))
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
# 测试
logger.debug("调试信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")

使用colorlog库(推荐)

首先安装:

pip install colorlog
import logging
import colorlog
def setup_colored_logging():
    """配置彩色日志"""
    # 创建彩色格式化器
    formatter = colorlog.ColoredFormatter(
        "%(log_color)s%(asctime)s - %(levelname)-8s - %(message)s%(reset)s",
        datefmt="%Y-%m-%d %H:%M:%S",
        log_colors={
            'DEBUG': 'cyan',
            'INFO': 'green',
            'WARNING': 'yellow',
            'ERROR': 'red',
            'CRITICAL': 'red,bg_white',
        },
        secondary_log_colors={},
        style='%'
    )
    # 设置处理器
    handler = colorlog.StreamHandler()
    handler.setFormatter(formatter)
    # 配置日志器
    logger = colorlog.getLogger(__name__)
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)
    return logger
# 使用
logger = setup_colored_logging()
logger.debug("这是一条调试信息")
logger.info("这是一条普通信息")
logger.warning("这是一条警告信息")
logger.error("这是一条错误信息")
logger.critical("这是一条严重错误")

使用rich库(功能更强大)

安装:

pip install rich
from rich.logging import RichHandler
from rich.console import Console
import logging
# 配置rich日志
logging.basicConfig(
    level="NOTSET",
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True)]
)
logger = logging.getLogger("rich")
logger.debug("调试信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")

高级示例:自定义彩色日志类

import logging
import sys
from datetime import datetime
class CustomColoredFormatter(logging.Formatter):
    """自定义高级彩色日志格式器"""
    # ANSI颜色代码
    COLORS = {
        'DEBUG': '\033[36m',      # 青色
        'INFO': '\033[32m',       # 绿色
        'WARNING': '\033[33m',    # 黄色
        'ERROR': '\033[31m',      # 红色
        'CRITICAL': '\033[35m',   # 紫色
    }
    # 背景色
    BG_COLORS = {
        'CRITICAL': '\033[41m',   # 红色背景
        'ERROR': '\033[101m',     # 亮红色背景
    }
    # 文本样式
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'
    def format(self, record):
        # 获取颜色
        level_color = self.COLORS.get(record.levelname, '')
        bg_color = self.BG_COLORS.get(record.levelname, '')
        # 格式化时间
        record.asctime = self.formatTime(record, '%Y-%m-%d %H:%M:%S')
        # 构建带颜色的消息
        level_name = f"{level_color}{bg_color}{self.BOLD}{record.levelname:8}{self.RESET}"
        message = f"{level_color}{record.getMessage()}{self.RESET}"
        return f"{record.asctime} - {level_name} - {message}"
def setup_logger(name=__name__):
    """设置彩色日志系统"""
    # 创建日志器
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    # 创建控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(logging.DEBUG)
    # 设置格式化器
    formatter = CustomColoredFormatter()
    console_handler.setFormatter(formatter)
    # 添加处理器
    logger.addHandler(console_handler)
    return logger
# 使用示例
if __name__ == "__main__":
    logger = setup_logger(__name__)
    logger.debug("数据库查询完成")
    logger.info("用户登录成功")
    logger.warning("磁盘空间不足,还剩10%")
    logger.error("无法连接到数据库")
    logger.critical("系统崩溃,需要立即修复!")

Windows兼容方案

Windows终端可能不支持ANSI颜色码,可以使用colorama库:

pip install colorama
import logging
from colorama import init, Fore, Back, Style
# 初始化colorama(Windows支持)
init(autoreset=True)
class ColoramaFormatter(logging.Formatter):
    def format(self, record):
        # 根据不同级别设置颜色
        if record.levelno == logging.DEBUG:
            prefix = Fore.CYAN
        elif record.levelno == logging.INFO:
            prefix = Fore.GREEN
        elif record.levelno == logging.WARNING:
            prefix = Fore.YELLOW
        elif record.levelno == logging.ERROR:
            prefix = Fore.RED
        else:
            prefix = Fore.MAGENTA + Back.RED
        message = super().format(record)
        return f"{prefix}{message}{Style.RESET_ALL}"
# 配置
handler = logging.StreamHandler()
handler.setFormatter(ColoramaFormatter('%(asctime)s - %(levelname)s - %(message)s'))
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("彩色日志输出成功!")

推荐选择

  1. 简单需求:使用ANSI转义码
  2. 标准方案:使用colorlog
  3. 功能丰富:使用rich
  4. Windows兼容:使用colorama

选择哪种方法取决于你的具体需求和项目环境。colorlog通常是最好的平衡点,既简单又功能完善。

抱歉,评论功能暂时关闭!