【问题标题】:Summary count for Python loggingPython 日志记录的汇总计数
【发布时间】:2010-05-17 07:29:43
【问题描述】:

在我的 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")

最后我想得到一个摘要,例如:

input: 5
input.network: 2
output: 1

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

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

【问题讨论】:

    标签: python logging


    【解决方案1】:

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

    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)
    

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

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

    这里有一个更完整的解决方案。对不起,我意识到我是someone that was wrong on the internet

    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)
    

    【讨论】:

      【解决方案2】:

      我认为装饰器模式可能是实现这一点的最简洁的方法。

      您将向 LoggerDecorator 传递一个 Logger 实例,该实例将具有与记录器相同的接口。当其中一种方法被调用时,适当地增加一个成员变量。那么实现 getCount() 方法就很简单了。

      这里是在 Python 中实现装饰器的参考:

      http://wiki.python.org/moin/DecoratorPattern

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 2020-11-07
        相关资源
        最近更新 更多