Python color logging

#!/tool/python/3.6.12/bin/python3

"""
@File: logger.py
@Author:
@Date: 
@Contact:
@Desc: define Log class
"""


import logging


class ColorHandler(logging.StreamHandler):
    """彩色日志,根据不同级别的日志显示不同颜色"""

    def emit(self, record):
        try:
            msg = self.format(record)
            if record.levelno == 10:
                print('\033[0;36m%s\033[0m' % msg)  # 绿色
            elif record.levelno == 20:
                print('\033[0;32m%s\033[0m' % msg)  # 青蓝色
            elif record.levelno == 30:
                print('\033[0;34m%s\033[0m' % msg)  # 蓝色
            elif record.levelno == 40:
                print('\033[0;35m%s\033[0m' % msg)  # 紫红色
            elif record.levelno == 50:
                print('\033[0;31m%s\033[0m' % msg)  # 血红色
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)


class Log:
    """
        logger = logging.getLogger("mainModule")
        self.logger = logging.getLogger("mainModule.sub.module")
    """
    level_dict = {"CRITICAL": 50,
                  "FATAL": 50,
                  "ERROR": 40,
                  "WARNING": 30,
                  "WARN": 30,
                  "INFO": 20,
                  "DEBUG": 10,
                  "NOTSET": 0}

    def __init__(self, level="INFO", name=""):
        self.level = self.level_dict[level]
        self.logger = logging.getLogger(name)
        self.logger.setLevel(self.level)
        self.formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s", "%Y-%m-%d %H:%M:%S")
        # self.console = logging.StreamHandler()
        self.console = ColorHandler()
        self.console.setLevel(self.level)
        # self.console.setFormatter(self.formatter)
        # self.console.setFormatter(logging.Formatter('%(asctime)s - %(message)s', "%Y-%m-%d %H:%M:%S"))
        self.console.setFormatter(logging.Formatter( "%(levelname)s: %(message)s"))
        self.logger.addHandler(self.console)

    def set_log_name(self, log_name):
        self.write_log = True
        self.handler = logging.FileHandler(log_name, mode='w')
        self.handler.setLevel(self.level)
        self.handler.setFormatter(self.formatter)
        self.logger.addHandler(self.handler)

    def clear_logger(self):
        if self.write_log:
            self.handler.close()
            self.logger.removeHandler(self.handler)
        self.console.close()
        self.logger.removeHandler(self.console)

### 实现 Python `logging` 模块中的彩色日志输出 为了在 Python 的 `logging` 模块中实现彩色日志输出,可以通过多种方法完成这一目标。以下是几种常见的解决方案及其具体实现。 #### 方法一:使用第三方库 `coloredlogs` `coloredlogs` 是一个专门用于增强 Python 日志模块的工具,能够轻松实现在终端上显示带有颜色日志信息[^1]。通过安装该库并配置其参数即可快速启用彩色日志功能。 ##### 安装依赖 ```bash pip install coloredlogs ``` ##### 配置代码示例 ```python import logging import coloredlogs # 创建 logger 对象 logger = logging.getLogger(__name__) # 设置日志级别 logger.setLevel(logging.DEBUG) # 初始化 coloredlogs coloredlogs.install( level='DEBUG', fmt='%(asctime)s %(levelname)s %(message)s', # 自定义日志格式 datefmt='%Y-%m-%d %H:%M:%S' # 时间戳格式 ) # 测试不同级别的日志记录 logger.debug("This is a debug message.") logger.info("This is an info message.") logger.warning("This is a warning message.") # 黄色警告 logger.error("This is an error message.") # 红色错误 logger.critical("This is a critical message.") # 加粗红色严重错误 ``` 此方法简单易用,适合希望减少开发工作量的应用场景。 --- #### 方法二:自定义 Formatter 添加 ANSI 转义序列 如果不想引入额外的外部依赖,则可以直接利用 ANSI 控制字符来自定义日志颜色[^2]。这种方式更加灵活,但也需要手动处理更多细节。 ##### 定义颜色常量 ANSI 转义码可用于设置字体颜色和样式。下面是一些常用的转义码: | 字体颜色 | 值 | |----------|------------| | Black | `\033[30m` | | Red | `\033[31m` | | Green | `\033[32m` | | Yellow | `\033[33m` | | Blue | `\033[34m` | 重置颜色命令为:`\033[0m` ##### 编写 ColoredFormatter 类 ```python import logging class ColoredFormatter(logging.Formatter): COLORS = { 'DEBUG': '\033[94m', # Light blue 'INFO': '\033[92m', # Light green 'WARNING': '\033[93m', # Light yellow 'ERROR': '\033[91m', # Light red 'CRITICAL': '\033[1;31m' # Bold red } RESET_SEQ = "\033[0m" def format(self, record): color = self.COLORS.get(record.levelname, "") msg = super().format(record) return f"{color}{msg}{self.RESET_SEQ}" # 创建 logger 和 handler logger = logging.getLogger() handler = logging.StreamHandler() # 使用自定义 formatter formatter = ColoredFormatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 将 handler 绑定到 logger 上 logger.addHandler(handler) logger.setLevel(logging.DEBUG) # 输出测试日志 logger.debug("Debug log entry") logger.info("Info log entry") logger.warning("Warning log entry") # 显示黄色 logger.error("Error log entry") # 显示红色 logger.critical("Critical log entry") # 显示加粗红色 ``` 这种方法完全控制了日志颜色逻辑,并且不依赖任何外部包。 --- #### 方法三:集成现有框架(如 `Logger` 工具类) 某些项目可能已经提供了封装好的日志管理器,例如引用中提到的 `Logger` 类[^3]。这种情况下只需按照既有的接口调用即可获得所需的功能。 ##### 示例代码 ```python from Common.tools.logger import Logger # 初始化 logger logger = Logger(logger="example_logger").getlog() # 记录不同类型的消息 logger.info('这是一个普通的信息.') logger.error('发生了一个错误.') # 错误消息通常会高亮显示 logger.warning('存在潜在的风险情况.') # 提醒用户注意特定事件 logger.debug('调试模式下的详细数据.') logger.critical('系统处于不可恢复状态!') ``` 需要注意的是,此类方案的具体行为取决于所使用的工具集内部实现机制。 --- #### 总结 以上三种方式各有优劣: - **`coloredlogs`** 库易于部署,特别适用于快速原型设计阶段; - **自定义 Formatter** 则赋予开发者更大的自由度去调整外观风格; - 如果团队已有成熟的日志管理系统,则优先考虑复用已存在的组件以保持一致性。 无论采用哪种途径,在实际应用过程中都应充分考虑到跨平台兼容性和生产环境需求等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值