2009-05-01 53 views
9

也許它只是不存在,因爲我無法在pydoc中找到它。但是使用python的日誌包,是否有一種方法可以查詢Logger來查找某個函數被調用了多少次?例如,報告了多少錯誤/警告?logging.error()調用了多少次?

回答

12

記錄模塊似乎不支持這一點。從長遠來看,您可能會更好地創建一個新模塊,並通過在現有日誌記錄模塊中對子項進行子分類來添加此功能,以添加所需的功能,但您也可以使用裝飾器輕鬆實現此功能:

class callcounted(object): 
    """Decorator to determine number of calls for a method""" 

    def __init__(self,method): 
     self.method=method 
     self.counter=0 

    def __call__(self,*args,**kwargs): 
     self.counter+=1 
     return self.method(*args,**kwargs) 


import logging 
logging.error=callcounted(logging.error) 
logging.error('one') 
logging.error('two') 
print logging.error.counter 

輸出:

ERROR:root:one 
ERROR:root:two 
2 
0

There'a warnings模塊,在某種程度上,做一些。

您可能需要將此計數功能添加到定製的Handler。問題是有一百萬個處理程序,您可能想要將其添加到多種處理程序中。

您可能希望將其添加到Filter,因爲它獨立於正在使用的處理程序。

7

您還可以添加一個新的處理程序的記錄器,其對所有呼叫:

class MsgCounterHandler(logging.Handler): 
    level2count = None 

    def __init__(self, *args, **kwargs): 
     super(MsgCounterHandler, self).__init__(*args, **kwargs) 
     self.level2count = {} 

    def emit(self, record): 
     l = record.levelname 
     if (l not in self.level2count): 
      self.level2count[l] = 0 
     self.level2count[l] += 1 

然後,您可以使用字典後erwards輸出呼叫數量。

+0

這對我來說很理想。裝飾者答案隱藏了從中調用記錄器的真實函數名稱和行號。使用自定義處理程序,它完美運行。 – 2016-04-07 01:59:29