在我的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模块中其中一个类的子类,但我不确定什么是最好的方法.
使用装饰器可能非常优雅,我还没有测试过这个,但类似这样的东西可以工作:
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)
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |