2009-05-01 14 views
9

Belki de yok, pydoc'ta bulamadığım için. Fakat python'un günlük paketini kullanarak, belirli bir fonksiyonun kaç kez çağrıldığını bulmak için bir Kaydediciyi sorgulamanın bir yolu var mı? Örneğin, kaç hata/uyarı bildirildi?Logging.error() kaç kere çağrıldı?

cevap

12

Günlük modülü bunu destekliyor görünmüyor. Uzun vadede muhtemelen yeni bir modül oluşturmanın daha iyi olması ve ihtiyacınız olan özellikleri eklemek için varolan kayıt modülündeki öğeleri alt sınıflara ekleyerek daha iyi olacaksınız, ancak bu davranışı bir dekoratör ile kolayca başarabilirsiniz. :

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 

Çıktı:

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

warnings modülü var - bir dereceye kadar - bunlardan bazıları.

Bu sayma özelliğini özelleştirilmiş bir Handler numarasına eklemek isteyebilirsiniz. Sorun şu ki, bir milyon işleyici var ve bunu birden fazla türe eklemek isteyebilirsiniz.

Filter numarasına eklemek isteyebilirsiniz, çünkü bunlar kullanımdaki İşleyicilerinden bağımsızdır.

7
Ayrıca tüm çağrıları saydığı günlükçüsüne yeni işleyicisi ekleyebilir

:

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 

ardından dict kıç kullanabilirsiniz çağrıların sayısını çıkarmak için erwards.

+0

Bu benim için idealdi. Dekoratörün yanıtı, logger'ın çağrıldığı gerçek fonksiyon adını ve satır numarasını gölgeledi. Özel bir işleyici ile mükemmel çalıştı. –