代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen Dr. Watson

Python日志记录的摘要计数

  •  6
  • Craig McQueen Dr. Watson  · 技术社区  · 16 年前

    在我的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() 用于记录器或处理程序的方法。

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   Craig McQueen Dr. Watson    16 年前

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

    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)
    

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

    我觉得我没有足够的睡眠,我的想法是把对你的记录器的调用打包,我把decorator的使用和decorator模式混合在一起。(实际上,混合使用模式和语法将是一个很好的答案)

    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
  •  2
  •   Robben_Ford_Fan_boy    16 年前

    我认为decorator模式可能是实现这一点的最干净的方法。

    您将把Logger的一个实例传递给LoggerDecorator,它将与Logger具有相同的接口。当调用其中一个方法时,根据需要增加一个成员变量。那么实现getCount()方法将是微不足道的。

    以下是关于在Python中实现decorator的参考:

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