Python使用colorlog库为日志添加色彩编码

 更新时间:2025年12月08日 09:23:27   作者:诸神缄默不语  
在日常开发和调试中,日志是我们最亲密的伙伴,但是,面对密密麻麻的黑白日志文本,快速定位错误、警告或关键信息往往如同大海捞针,这时候,colorlog 库就能大显身手了!本文给大家介绍了Python如何使用colorlog库为日志添加色彩编码,需要的朋友可以参考下

还在看单调的黑白日志吗?给日志加点颜色,让调试变得更高效!

前言:为什么需要彩色日志?

在日常开发和调试中,日志是我们最亲密的伙伴。但是,面对密密麻麻的黑白日志文本,快速定位错误、警告或关键信息往往如同大海捞针。这时候,colorlog 库就能大显身手了!它能为不同级别的日志信息添加不同的颜色,让日志输出一目了然,大大提升调试效率。

使用 colorlog 为日志添加色彩编码,能让不同严重级别的信息一目了然,从而提升调试体验。

什么是 colorlog?

colorlog 是一个 Python 日志格式化工具,它扩展了 Python 标准库中的 logging 模块,专门用于在终端输出带颜色的日志 。通过为不同日志级别配置不同颜色,我们可以快速区分 DEBUG、INFO、WARNING、ERROR 等级别的信息。

安装 colorlog

安装 colorlog 非常简单,只需使用 pip:

pip install colorlog

基础用法:快速上手

让我们先来看一个简单的例子,了解 colorlog 的基本使用方法:

import colorlog
import logging

# 创建 logger 实例
logger = colorlog.getLogger('example')

# 创建 StreamHandler
handler = colorlog.StreamHandler()

# 设置格式化器
handler.setFormatter(colorlog.ColoredFormatter(
    '%(log_color)s%(levelname)s:%(name)s:%(message)s'
))

# 添加 handler 到 logger
logger.addHandler(handler)

# 设置日志级别
logger.setLevel(logging.DEBUG)

# 测试不同级别的日志输出
logger.debug("这是一条 DEBUG 级别的日志")
logger.info("这是一条 INFO 级别的日志")
logger.warning("这是一条 WARNING 级别的日志")
logger.error("这是一条 ERROR 级别的日志")
logger.critical("这是一条 CRITICAL 级别的日志")

运行上面的代码,你将在终端中看到不同颜色的日志输出,默认情况下:

  • DEBUG:青色
  • INFO:绿色
  • WARNING:黄色
  • ERROR:红色
  • CRITICAL:红色背景白色文字

核心组件详解

ColoredFormatter 类

ColoredFormatter 是 colorlog 的核心类,它继承自 Python 标准的 logging.Formatter,专门用于生成带颜色的日志输出 。

主要参数说明:

  • format:用于输出日志的格式化字符串(必需)
  • datefmt:可选的日期格式,传递给基类
  • reset:默认为 True,表示在消息输出结束时添加颜色重置代码
  • log_colors:日志级别到颜色名称的映射
  • secondary_log_colors:定义在格式化字符串中可用的其他颜色
  • style:在 Python 3.2 以上版本可用

颜色配置详解

colorlog 支持丰富的颜色配置选项:

基本颜色名称: black, red, green, yellow, blue, purple, cyan, white

颜色前缀:

  • fg_{color}:设置前景色(文字颜色)
  • bg_{color}:设置背景色 
  • boldbold_{color}:设置粗体/亮色

特殊代码:

  • reset:清除所有格式(包括前景色和背景色)

高级配置技巧

1. 自定义日志颜色

你可以完全自定义每个日志级别的颜色:

from colorlog import ColoredFormatter

formatter = ColoredFormatter(
    "%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s",
    datefmt=None,
    reset=True,
    log_colors={
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'red,bg_white',
    },
    secondary_log_colors={},
    style='%'
)

handler = logging.StreamHandler()
handler.setFormatter(formatter)

logger = logging.getLogger('custom_example')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

2. 使用辅助颜色

secondary_log_colors 允许你为同一日志消息的不同部分设置不同的颜色规则:

formatter = ColoredFormatter(
    "%(log_color)s%(levelname)-8s%(reset)s %(message_log_color)s%(message)s",
    secondary_log_colors={
        'message': {
            'ERROR': 'red',
            'CRITICAL': 'red'
        }
    }
)

这个配置会让 ERROR 和 CRITICAL 级别的日志消息本身显示为红色,而其他级别的消息保持默认颜色 。

3. 使用字典配置

对于大型项目,推荐使用 dictConfig 进行配置:

import logging.config

logging.config.dictConfig({
    'formatters': {
        'colored': {
            '()': 'colorlog.ColoredFormatter',
            'format': "%(log_color)s%(levelname)-8s%(reset)s %(blue)s%(message)s"
        }
    },
    'handlers': {
        'stream': {
            'class': 'logging.StreamHandler',
            'formatter': 'colored',
        },
    },
    'root': {
        'handlers': ['stream'],
        'level': 'DEBUG',
    }
})

logger = logging.getLogger('dict_config_example')

4. 配置文件方式

你也可以使用 .ini 格式的配置文件:

[loggers]
keys=root

[logger_root]
handlers=stream
level=DEBUG

[formatters]
keys=color

[formatter_color]
class=colorlog.ColoredFormatter
format=%(log_color)s%(levelname)s:%(name)s:%(message)s
datefmt=%H:%M:%S

[handlers]
keys=stream

[handler_stream]
class=StreamHandler
formatter=color
args=()

然后在代码中加载配置:

import logging
import logging.config

logging.config.fileConfig('logging_config.ini')
logger = logging.getLogger('config_file_example')

实际应用示例

在 FastAPI 项目中使用 colorlog

让我们看看如何在 FastAPI 项目中使用 colorlog 来美化日志输出:

import colorlog
import logging
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

# 配置日志
handler = colorlog.StreamHandler()
formatter = colorlog.ColoredFormatter(
    "%(log_color)s%(asctime)s - %(levelname)-8s%(reset)s %(blue)s%(name)-15s %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    log_colors={
        'DEBUG': 'cyan',
        'INFO': 'bold_green',
        'WARNING': 'bold_yellow',
        'ERROR': 'bold_red',
        'CRITICAL': 'bold_red,bg_white',
    }
)
handler.setFormatter(formatter)

# 为 FastAPI 相关日志器配置 colorlog
uvicorn_logger = logging.getLogger("uvicorn")
uvicorn_logger.handlers = []
uvicorn_logger.addHandler(handler)
uvicorn_logger.setLevel(logging.DEBUG)

uvicorn_access = logging.getLogger("uvicorn.access")
uvicorn_access.handlers = []
uvicorn_access.addHandler(handler)

app = FastAPI(title="Colorful API", version="1.0.0")
logger = colorlog.getLogger("api")
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

class Item(BaseModel):
    name: str
    description: str = None
    price: float

@app.get("/")
async def read_root():
    logger.info("访问根路径")
    return {"message": "欢迎使用彩色日志 API!"}

@app.post("/items/")
async def create_item(item: Item):
    logger.debug(f"创建商品: {item.name}, 价格: {item.price}")
    
    if item.price <= 0:
        logger.warning(f"商品价格无效: {item.price}")
        raise HTTPException(status_code=400, detail="价格必须大于0")
    
    logger.info(f"成功创建商品: {item.name}")
    return {"status": "success", "item": item}

@app.get("/error-test")
async def error_test():
    try:
        # 模拟一个错误
        result = 1 / 0
    except Exception as e:
        logger.error(f"发生错误: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail="内部服务器错误")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000, log_config=None)

同时输出到控制台和文件

有时候,我们既想要在控制台看到彩色日志,又希望将日志保存到文件中(不包含颜色代码):

import colorlog
import logging

# 创建 logger
logger = colorlog.getLogger('multi_handler')

# 控制台 Handler(带颜色)
console_handler = colorlog.StreamHandler()
console_formatter = colorlog.ColoredFormatter(
    "%(log_color)s%(asctime)s %(levelname)-8s%(reset)s %(blue)s%(message)s",
    datefmt="%H:%M:%S"
)
console_handler.setFormatter(console_formatter)

# 文件 Handler(无颜色)
file_handler = logging.FileHandler('app.log')
file_formatter = logging.Formatter(
    "%(asctime)s %(levelname)-8s %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
file_handler.setFormatter(file_formatter)

# 添加两个 handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.setLevel(logging.DEBUG)

# 测试日志
logger.info("这条消息会同时显示在控制台(带颜色)和文件(无颜色)中")

自定义日志级别

你甚至可以创建自定义的日志级别并为其指定颜色:

import logging
import colorlog

# 创建自定义日志级别
TRACE = 5
logging.addLevelName(TRACE, 'TRACE')

# 添加 trace 方法到 logger
def trace(self, message, *args, **kws):
    if self.isEnabledFor(TRACE):
        self._log(TRACE, message, args, **kws)

logging.Logger.trace = trace

# 配置 colorlog 包含自定义级别
formatter = colorlog.ColoredFormatter(
    log_colors={
        'TRACE': 'yellow',
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'red,bg_white',
    },
    format='%(log_color)s%(levelname)-8s%(reset)s %(message)s'
)

handler = logging.StreamHandler()
handler.setFormatter(formatter)

logger = colorlog.getLogger('custom_level')
logger.addHandler(handler)
logger.setLevel(TRACE)

# 使用自定义级别
logger.trace("这是一条 TRACE 级别的日志")

注意事项和最佳实践

  1. 兼容性:colorlog 主要适用于终端输出,在文件日志中颜色代码可能会显示为乱码。
  2. 性能:在生产环境中,可以考虑根据环境变量决定是否启用彩色日志,以减少不必要的性能开销。
  3. 一致性:在团队项目中,建议统一颜色配置,确保所有成员对颜色含义有相同的理解。
  4. 可访问性:考虑到色盲或色弱用户,不要完全依赖颜色来区分日志级别,还应该保留文字级别的信息。

以上就是Python使用colorlog库为日志添加色彩编码的详细内容,更多关于Python colorlog日志颜色的资料请关注脚本之家其它相关文章!

相关文章

  • 用Python制作灯光秀短视频的思路详解

    用Python制作灯光秀短视频的思路详解

    这篇文章主要介绍了用Python制作灯光秀短视频的思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-04-04
  • Python类型提示Type Hints示例详解

    Python类型提示Type Hints示例详解

    在做自动化测试的时候,类型提示会让你写代码时更加流程,当你在一个模块定义了类型,而其他模块没有提示的时候,是相当不方便,这篇文章主要给大家介绍了关于Python类型提示Type Hints的相关资料,需要的朋友可以参考下
    2021-08-08
  • Pycharm如何设置默认请求头和切换python环境

    Pycharm如何设置默认请求头和切换python环境

    这篇文章主要介绍了Pycharm如何设置默认请求头和切换python环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Python如何实现的简单购物车程序

    Python如何实现的简单购物车程序

    这篇文章主要介绍了Python如何实现的简单购物车程序,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-05-05
  • 浅谈Python 的枚举 Enum

    浅谈Python 的枚举 Enum

    下面小编就为大家带来一篇浅谈Python 的枚举 Enum。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 使用Pycharm分段执行代码

    使用Pycharm分段执行代码

    这篇文章主要介绍了使用Pycharm分段执行代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python读取HTML中的canvas并且以图片形式存入Word文档

    Python读取HTML中的canvas并且以图片形式存入Word文档

    这篇文章主要介绍了Python读取HTML中的canvas并且以图片形式存入Word文档,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • python接口调用已训练好的caffe模型测试分类方法

    python接口调用已训练好的caffe模型测试分类方法

    今天小编就为大家分享一篇python接口调用已训练好的caffe模型测试分类方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python如何实现在字符串里嵌入双引号或者单引号

    Python如何实现在字符串里嵌入双引号或者单引号

    今天小编就为大家分享一篇Python如何实现在字符串里嵌入双引号或者单引号,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python通过四大 AutoEDA 工具包快速产出完美数据报告

    Python通过四大 AutoEDA 工具包快速产出完美数据报告

    在三年前,我们做数据竞赛或者数据建模类的项目时,前期我们会耗费较多的时间去分析数据,但现在非常多擅长数据分析的大师们已经将我们平时常看的数据方式进行了集成,开发了很多AutoEDA的工具包。可以帮助我们节省大量时间
    2021-11-11

最新评论