如何为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")
说明:
- ANSI转义码是终端识别的颜色控制指令,
\033[0m用来重置颜色,防止后续的输出也带上之前的颜色。 - 这里把INFO级别设为绿色,和print的默认输出色调接近,如果你想让它和print完全一样,把
logging.INFO对应的颜色改成'\033[0m'(终端默认色)就行。 - 全程只用了根logger,没有创建额外的logger实例,完全符合你想要的“简单logging”使用习惯。
- 要是你的终端不支持ANSI颜色(这种情况很少见了),转义码会被当成普通字符显示,但不会影响日志内容本身。
备注:内容来源于stack exchange,提问作者fascynacja
相关产品推荐
相关产品推荐

