为logging开启颜色输出 python

这篇博客介绍了如何利用Python内置的logging模块,通过创建自定义Filter类来改变日志输出的等级颜色,提高信息检索效率。核心思路是通过Filter类修改LogRecord的上下文环境,并在Formatter中引用这些变量,实现不同等级的日志输出不同颜色的效果。作者提供了代码示例,并鼓励读者前往其博客获取完整实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值