Python日志记录的摘要计数

Cra*_*een 6 python logging

在我的Python程序结束时,我希望能够获得通过标准logging模块记录的项目数的摘要.我特别希望能够为每个指定的名称(可能还有它的孩子)计算.例如,如果我有:

input_logger = getLogger('input')
input_logger.debug("got input1")
input_logger.debug("got input2")
input_logger.debug("got input3")

network_input_logger = getLogger('input.network')
network_input_logger.debug("got network input1")
network_input_logger.debug("got network input2")

getLogger('output')
output_logger.debug("sent output1")
Run Code Online (Sandbox Code Playgroud)

然后在最后我想得到一个总结,如:

input: 5
input.network: 2
output: 1
Run Code Online (Sandbox Code Playgroud)

我在想,通过调用getcount()记录器或处理程序的方法.

实现这一目标的好方法是什么?我想它会涉及logging模块中其中一个类的子类,但我不确定什么是最好的方法.

Mic*_*ael 3

使用装饰器可能非常优雅,我还没有测试过这个,但类似这样的东西可以工作:

class myDecorator(object):
    def __init__(self, inner):
        self.inner = inner
        self.log = {}

    def __getattr__(self,name):
        self.log[name] = self.log.get(name,0)+1
        return getattr(self.inner,name)

    def __setattr__(self,name,value):
        setattr(self.inner,name,value)
Run Code Online (Sandbox Code Playgroud)

我意识到您不想记录对每个方法的调用次数,而是记录对每个不同记录器的调用次数。尽管如此,我认为装饰器可以非常优雅。

我认为我没有足够的睡眠,想法是包装对记录器的调用,我将装饰器的使用与装饰器模式混合在一起。(实际上模式和语法的混合将是一个很好的答案)

这是一个更完整的解决方案。抱歉,我意识到我是在互联网上犯错的人

class LoggerLogger(object):
    def __init__(self,inner,name):
        self.inner = inner
        self.calls = 0
    def __call__(self,*args,**kwargs):
        self.calls += 1
        return self.inner(*args,**kwargs)


def loggerDecorator(func):
    def inner(name):
        logger = func(name)
        logger.debug = LoggerLogger(logger.debug,name)
    return inner

getLogger = loggerDecorator(getLogger)
Run Code Online (Sandbox Code Playgroud)