2010-05-17 13 views
5

Na końcu mojego programu Python chciałbym móc uzyskać podsumowanie liczby elementów zalogowanych za pomocą standardowego modułu logging. Chciałbym konkretnie uzyskać liczbę dla każdej określonej nazwy (i ewentualnie jej dzieci). Na przykład. jeśli mam:Podsumowanie dla rejestrowania w Pythonie

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") 

Następnie na koniec chciałbym uzyskać podsumowanie, takie jak:

input: 5 
input.network: 2 
output: 1 

myślę, wywołując getcount() metodę rejestratora lub obsługi.

Jaki byłby dobry sposób, aby to osiągnąć? Wyobrażam sobie, że obejmowałoby to pod-klasę jednej z klas w module logging, ale nie jestem pewien, jaki byłby najlepszy sposób.

Odpowiedz

3

Korzystanie dekorator może być bardzo elegancki, nie testowałem tego, ale coś takiego może działać:

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) 

Mam świadomość, że nie chcesz się zalogować liczbę połączeń do każdej metody ale wzywa do każdego innego rejestratora. Mimo wszystko myślę, że dekorator może być całkiem elegancki.

Nie sądzę, żebym miał dość snu, pomysł polegałby na zawijaniu połączeń do loggera, łączę użycie dekoratora z wzorem dekoratora. (Właściwie mieszanka wzorca i składni byłaby świetną odpowiedzią)

Oto bardziej kompletne rozwiązanie. Przepraszam, zdałem sobie sprawę, że jestem 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 Za tym przykładem !!! –

2

Myślę, że wzór dekoratora może być najczystszą metodą realizacji tego.

Zdasz instancję programu Logger do LoggerDecorator, który będzie miał ten sam interfejs co program rejestrujący. Gdy wywoływana jest jedna z metod, zwiększ odpowiednio zmienną składową. Wówczas implementacja metody getCount() będzie banalna.

Oto referencyjna na wdrożenie dekorator w Pythonie:

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

Powiązane problemy