2010-05-17 7 views
5

Python 프로그램이 끝나면 표준 logging 모듈을 통해 기록 된 항목의 수를 요약해서 볼 수 있습니다. 나는 특별히 지정된 이름 (그리고 아마도 그 자식들)마다 카운트를 얻을 수 있기를 바란다. 예 : 내가있는 경우 : 내가 로거 또는 핸들러에 대한 getcount() 메서드를 호출하여, 생각하고파이썬 로깅 요약 횟수

input: 5 
input.network: 2 
output: 1 

:

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

는 그런 말에 나는 같은 요약을 좀하고 싶습니다.

이것을 달성하는 좋은 방법은 무엇입니까? 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) 

을 당신이 각 방법에 호출 수를 기록하지 않았다 실현하고 있습니다 : 꽤 우아한 될 수있는 장식을 사용하여

답변

3

, 내가 일할 수있는 그런 것 같 그러나이 테스트하지 않았습니다 그러나 각기 다른 로거를 호출합니다. 나는 장식 자도 꽤 우아 할 수 있다고 생각한다.

충분한 수면을 취하지 못했다고 생각합니다. 로거에 전화를 겁니다. 데코레이터를 데코레이터 패턴과 함께 사용하고 있습니다. (실제로 패턴과 구문의 혼합은 훌륭한 답이 될 것입니다.)

다음은 더 완벽한 해결책입니다. 내가 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 일례를 포함한 !!! –

2

데코레이터 패턴이 이것을 구현하는 데 가장 깨끗한 방법 일 것이라고 생각합니다.

로거의 인스턴스를 로거와 동일한 인터페이스를 갖는 LoggerDecorator로 전달합니다. 메서드 중 하나가 호출되면 멤버 변수를 적절하게 증가시킵니다. 그런 다음 getCount() 메소드를 구현하는 것은 간단합니다. 여기

파이썬 장식 구현에 대한 기준이다

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