2010-05-17 100 views
5

在我的Python程序結束時,我希望能夠獲得通過標準logging模塊記錄的項目數的摘要。我特別希望能夠爲每個指定名稱(以及可能的子項)計數。例如。如果我有:Python日誌摘要計數

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模塊中的一個類的子類,但我不確定最好的方法是什麼。

回答

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) 

我意識到,你不希望呼叫的號碼登錄到每個方法但呼叫每個不同的記錄器。儘管如此,我認爲裝飾者可以非常優雅。

我不認爲我已經有足夠的睡眠,這個想法將打包調用您的記錄器,我混合使用裝飾模式與裝飾。 (實際上,混合模式和語法將是一個很好的答案)

這是一個更完整的解決方案。對不起,我意識到我是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) 
+0

1對於包括例如!!! – 2010-05-17 07:51:53

2

我認爲裝飾者模式可能是最乾淨的方法來實現這一點。

您將傳遞Logger的一個實例到LoggerDecorator中,該LoggerDecorator將具有與記錄器相同的接口。當其中一個方法被調用時,根據需要增加一個成員變量。然後實現getCount()方法將是微不足道的。

這裏是在Python實施裝飾的引用:

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