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

作者:

文章目录
  • 在日常开发和调试中,日志是我们最亲密的伙伴。但是,面对密密麻麻的黑白日志文本,快速定位错误、警告或关键信息往往如同大海捞针。这时候,colorlog 库就能大显身手了!它能为不同级别的日志信息添加不同的颜色,让日志输出一目了然,大大提升调试效率。 使用 colorlog 为日志添加色彩编码,能让不同严重级别的信息一目了然,从而提升调试体验。
  • colorlog 是一个 Python 日志格式化工具,它扩展了 Python 标准库中的 logging 模块,专门用于在终端输出带颜色的日志 。通过为不同日志级别配置不同颜色,我们可以快速区分 DEBUG、INFO、WARNING、ERROR 等级别的信息。
  • 安装 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:红色背景白色文字
  • 你甚至可以创建自定义的日志级别并为其指定颜色: 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 级别的日志”)
  • 兼容性:colorlog 主要适用于终端输出,在文件日志中颜色代码可能会显示为乱码。 性能:在生产环境中,可以考虑根据环境变量决定是否启用彩色日志,以减少不必要的性能开销。 一致性:在团队项目中,建议统一颜色配置,确保所有成员对颜色含义有相同的理解。 可访问性:考虑到色盲或色弱用户,不要完全依赖颜色来区分日志级别,还应该保留文字级别的信息。 以上就是Python使用colorlog库为日志添加色彩编码的详细内容,更多关于Python colorlog日志颜色的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python使用colorlog实现控制台管理日志多种颜色显示 python中的colorlog库使用详解 python日志通过不同的等级打印不同的颜色(示例代码) Python 根据日志级别打印不同颜色的日志的方法示例
  • 目录
    • 前言:为什么需要彩色日志?
    • 什么是 colorlog?
    • 安装 colorlog
    • 基础用法:快速上手
    • 核心组件详解
      • ColoredFormatter 类
      • 颜色配置详解
    • 高级配置技巧
      • 1. 自定义日志颜色
      • 2. 使用辅助颜色
      • 3. 使用字典配置
      • 4. 配置文件方式
    • 实际应用示例
      • 在 FastAPI 项目中使用 colorlog
      • 同时输出到控制台和文件
    • 自定义日志级别
      • 注意事项和最佳实践

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

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

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

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

        安装 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 是 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:清除所有格式(包括前景色和背景色)

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

        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)
        

        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 级别的日志消息本身显示为红色,而其他级别的消息保持默认颜色 。

        对于大型项目,推荐使用 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')
        

        你也可以使用 .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 来美化日志输出:

        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使用colorlog实现控制台管理日志多种颜色显示
        • python中的colorlog库使用详解
        • python日志通过不同的等级打印不同的颜色(示例代码)
        • Python 根据日志级别打印不同颜色的日志的方法示例

        站内搜索