2011-08-16 7 views
3

모듈에 로깅을 포함시키고 싶지만, 모듈이 새로운 로그 객체/파일을 생성하는 것을 원하지 않습니다. 호출자 로그 객체를 사용하고 싶습니다. 그들이 하나를 통과한다면. 모든 로그 콜을 try 블록에 넣을 수는 있지만 어색합니다. 내가 마침내 생겨 났던 것은 효과가있는 것처럼 보이지만, 꽤 괴상한 것처럼 보이고, 더 좋은 방법이있을 것이라고 확신합니다.조건부 로깅 파이썬

class MyClass(object): 
    def __init__(self, arg1, arg2, log=None): 
     if log == None: 
      class log(object): 
       def error(self, msg): pass 
       def warning(self, msg): pass 
       def info(self, msg): pass 
       def debug(self, msg): pass 
      self.log = log() 
     else: 
      self.log = log 
     self.log.debug('Starting') 

이렇게하는 것이 더 좋은 방법은 무엇입니까?

감사합니다.

+0

나는 그것이 좋다고 생각한다. 로그 클래스를 싱글 톤 (singleton)에 넣고 NoneLog 또는 이와 비슷한 이름으로 호출하면 각 클래스의 코드를 줄일 수 있습니다. – Arne

답변

0

직접 logging 모듈, 즉 :

logging.debug('Starting') 

그들이 원하는 경우 루트 로거를 변경하려면 호출자에게 그것을 떠날가 제공하는 기능을 사용합니다.

+0

나는 따라 가지 않는다. 로그 객체를 전달하지 않은 경우 어떻게됩니까? – zenzic

+0

로깅 모듈은 표준 라이브러리의 일부이므로 가져온 각 모듈에 사용자 지정 로그 객체를 전달하지 않아도됩니다. – geoffspear

1

대부분의 로거는 일부 중앙 리소스가 어떤 클래스 (있는 경우)가 실제로 로깅하는 로그 함수 (더미 함수를 호출하는 대신)를 가져 오도록 팩토리 패턴을 사용합니다. 즉, 중앙 집중식 API와 중앙 집중식 제어가 있으며 클래스별로 클래스별로 로거를 정의 할 필요가 없습니다.

일반적으로 전달 된 매개 변수를 신호로 보는 것이 좋습니다. "이 객체를 사용하여 작업을 수행해야합니다.". MyClass이 로거가 아닌 한 매개 변수로 전달하는 것이 실제로 의미가 없습니다. 잘못된 디자인이라면 로거가 필요하지 않습니다.

0

선호하는 패턴 :

import logging 
LOGGER = logging.getLogger(__name__) 

class MyClass(object): 
    logger = LOGGER 

    def do_something(self, somesuch): 
     self.logger.debug("Starting %s", somesuch) 

myInstance = MyClass() 
if need_fancy_logging: 
    myInstance.logger = logging.getLogger("FancyLogger") 

myInstance.do_something("blabla") 

편집 : 정말 표준 logging 모듈은 실제로 아무것도 포함하지 않습니다, 바로 모든 것을 않습니다. 절대적 출력 경고 제외 발생

Python 2.7 (r27:82500, Sep 16 2010, 18:03:06) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import logging 
>>> log = logging.getLogger('foo') 
>>> log.debug('debug') 
>>> log.info('info') 
>>> log.error('error') 
No handlers could be found for logger "foo" 
>>> log.error('error') 
>>> 

참고 소모 될 때 그 메시지를 나타내는회 인쇄하고 있다고 특정 로거 책임이다.

+0

나는 뭔가를 놓치고 있거나 자신을 분명히하지 않는다고 생각합니다. 내가 쓰는 수업은 다른 사람들이 쓰는 수업 일 것이고, 나는 그들이하는 일에 대해 아무런 통제력이 없다. 그들이 로깅을 설정했다면 메시지를 기록하고 싶지만 로그 파일을 설정하지 않았다면 stdout에 덤프하고 싶지 않습니다. 당신의 방법은 그것을 촉진 할 수 있습니까? – zenzic

관련 문제