logging.error()被调用了多少次?

15 投票
4 回答
7935 浏览
提问于 2025-04-15 11:21

也许这个功能根本就不存在,因为我找不到它。不过,使用Python的日志记录包,有没有办法查询一个日志记录器,看看某个特定的函数被调用了多少次?比如说,有多少个错误或警告被记录了?

4 个回答

1

有一个叫做 warnings 的模块,它在一定程度上可以做到这些事情。

你可能想把这个计数功能添加到一个自定义的 处理器 中。问题是,有很多种处理器,你可能想把它添加到不止一种类型里。

你也可以考虑把它添加到一个 过滤器 中,因为过滤器和使用的处理器是独立的。

16

你还可以给日志记录器添加一个新的处理器,用来统计所有的调用次数:

class MsgCounterHandler(logging.Handler):
    level2count = None

    def __init__(self, *args, **kwargs):
        super(MsgCounterHandler, self).__init__(*args, **kwargs)
        self.level2count = {}

    def emit(self, record):
        l = record.levelname
        if (l not in self.level2count):
            self.level2count[l] = 0
        self.level2count[l] += 1

然后你可以使用这个字典来输出调用的次数。

22

看起来,日志模块并不支持这个功能。从长远来看,你可能更好地选择创建一个新的模块,通过继承现有日志模块中的项目来添加你需要的功能。不过,你也可以很简单地用一个装饰器来实现这个效果:

class CallCounted:
    """Decorator to determine number of calls for a method"""

    def __init__(self,method):
        self.method=method
        self.counter=0

    def __call__(self,*args,**kwargs):
        self.counter+=1
        return self.method(*args,**kwargs)


import logging
logging.error = CallCounted(logging.error)
logging.error('one')
logging.error('two')
print(logging.error.counter)

输出:

ERROR:root:one
ERROR:root:two
2

撰写回答