为logging开启颜色输出 python

我们都知道python自带的logging模块只能记录普通的白色,这样看起来控制台显得有点杂乱无章。有没有方法改变输出等级的颜色呢?这样的信息检索起来效率更高点。

当然是有的,而且利用logging自带的特性就能完成。

原理

我们这里主要是利用logging的Filter类,此类可以控制是否输出日志,同时修改日志的上下文环境。

先来看下面的代码:

import logging
from random import randint

class MyFilter(logging.Filter):

    def filter(self, record: logging.LogRecord) -> bool:
        # 当有新日志需要被记录时,此函数会被调用,用于判断是否记录该日志
        # 返回True代表允许记录,False代表不允许记录。
        record.rand = randint(0, 1024) # 此处修改上下文环境。
        return True

fmter = logging.Formatter("%(name)s - %(levelname)s - rand:%(rand)s - %(message)s")
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(fmter)
ch.addFilter(MyFilter())

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(ch)


logger.info('test info')
logger.error('test error')

本段代码的功能就是在 Filter 中修改这个 record,也就是修改了记录时的上下文环境。

看到这一行

fmter = logging.Formatter("%(name)s - %(levelname)s - rand:%(rand)s - %(message)s")

注意到了吗,我们这里引用了 rand:%(rand)s ,这个 rand 在 MyFilter 中被定义,handler 在输出时是如何找到 fmter 所定义的变量的呢? 其实就是去上下文里找,然鹅这个上下文被链接到了 record 中,所以你修改了 record 也就是修改了上下文环境。

如果你看懂了,就会灵光乍现

既然 fmter 定义的变量都是去 record 里面找的,那我们直接修改 levelname 变量,让他根据相应的等级输出对应的颜色不就好了吗?

没错,是这样的!

封装参考

前往我的博客获取完整代码
前往我的博客获取完整代码
前往我的博客获取完整代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过给 `logging` 模块的输出添加颜色来更好地区分不同级别的日志。具体方法是创建一个自定义的 `Formatter` 类,并在其中添加 ANSI 转义序列来修改文本颜色。 以下是一个示例代码: ```python import logging class ColoredFormatter(logging.Formatter): """ 自定义日志格式,添加颜色 """ def format(self, record): if record.levelno == logging.DEBUG: # 绿色字体 color_start = '\033[32m' elif record.levelno == logging.INFO: # 默认字体颜色 color_start = '' elif record.levelno == logging.WARNING: # 黄色字体 color_start = '\033[33m' elif record.levelno == logging.ERROR: # 红色字体 color_start = '\033[31m' elif record.levelno == logging.CRITICAL: # 紫色字体 color_start = '\033[35m' else: color_start = '' color_end = '\033[0m' self._style._fmt = color_start + self._style._fmt + color_end return super().format(record) # 创建 logger logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 创建 StreamHandler,并添加到 logger 中 handler = logging.StreamHandler() handler.setLevel(logging.DEBUG) # 创建 Formatter,并添加到 handler 中 formatter = ColoredFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 添加 handlerloggerlogger.addHandler(handler) # 输出不同级别的日志 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` 类 `ColoredFormatter`,并在其中根据不同的日志级别添加了不同的颜色。然后将这个 `Formatter` 添加到 `StreamHandler` 中,并将其添加到 logger 中,从而实现了对输出日志的颜色控制。 注意,为了保证每个日志输出颜色都是正确的,我们每次都需要在 `format` 方法中重新设置 `_style._fmt`。如果不这么做,可能会出现某些日志输出颜色不正确的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值