2013-08-05 3 views
0

우리가 개발중인 파이썬 응용 프로그램에는 로거가 필요합니다. 동료는 그것을 사용하는 모든 클래스에서 로거를 작성하고 구성해야한다고 주장합니다. 내 생각에 그것은 응용 프로그램 시작시 생성 및 구성되어야하며 생성자 매개 변수로 전달되어야합니다.파이썬 로거를 매개 변수로 전달해야합니까?

두 가지 변종 모두 장점이 있으며 모범 사례가 확실하지 않습니다.

+0

로거를 한 번만 구성하면되고 다른 클래스에서는 로깅 모듈을 가져 오면됩니다. 이 함수를 가져 와서 클래스 나 모듈을 테스트 할 수 있도록 'configure_logging'함수를 별도의 모듈 또는 기본 모듈에 만드는 것이 좋습니다. ('if __name__ == "__main __"'또는'unittest'에 start_logging을 임포트하십시오.) – joente

+0

단위 테스트의 경우 로거를 조롱하고 싶습니다. 로깅 모듈. –

+0

로거를 구현하는 것이 어떤 의미인지 더 잘 알기 위해 예를 들어 답변을 게시했습니다. 도움이 되었으면 좋겠습니다. 물론 아이디어 일 뿐이며 자신의 사례에 가장 적합한 솔루션을 찾으시기 바랍니다. – joente

답변

0

어쩌면 이것은 당신이 아이디어를 얻을하는 데 도움이? 물론 설정 파일이나 설정 파일에서 설정을 읽는 것이 훨씬 더 효과적 일 수 있습니다. 자체 테스트와 모듈에서

import logging 
from mylogmod import startlogging 
from myclass import MyClass 

startlogging() 

logging.info("Program started...") 
mc = MyClass() 

클래스 myclass.py : mylogmod.py : :이 main.py

import logging 

FILENAME = "mylog.log" # Your logfile 
LOGFORMAT = "%(message)s" # Your format 
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production 
LEVELS = { 
    'debug':logging.DEBUG, 
    'info':logging.INFO, 
    'warning':logging.WARNING, 
    'error':logging.ERROR, 
    'critical':logging.CRITICAL} 

def startlogging(filename=FILENAME, level=DEFAULT_LEVEL): 
    logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT) 

별도의 모듈

로깅을 구성 할 수 있습니다. 단위 테스트에서 로깅 모듈을 가져올 필요가 없으므로 startlogging 함수만으로도 충분합니다.이 방법으로 기본 수준을 경고 또는 오류로 설정할 수 있으며 unittests 및 self 디버그 테스트)

import logging 

class MyClass(object): 
    def __init__(self): 
     logging.info("Initialze MyClass instance...") 

if __name__ == "__main__": 
    from mylogmod import startlogging 
    startlogging(level="debug") 
    logging.debug("Test MyClass...") 
    #... rest of test code... 
+0

이것은 루트 로거를 사용하고 있습니다. 다른 응용 프로그램과 통합되는 정교한 응용 프로그램은 루트 로거를 사용하고 싶지 않습니다. –

0

매개 변수로 로거를 전달하는 것이 좋지 않다고 생각합니다. 글로벌 로거를 자체 모듈로 생각하면 최상의 아이디어 일 것입니다. 예를 들어 :
logger.py

import logging 
log = logging.getLogger('') 

classFoo.py

form logger import log 
log.debug('debug message') 

classBar.py는

form logger import log 
log.warn('warn!') 
+0

'__name__'이라는 이름의 로거를 사용하는 대신 빈 문자열이있는 이름의 로거를 항상 사용하기 때문에 좋은 생각이 아닙니다. 내 대답을 참조하십시오. –

0

일반적으로 그렇지 않습니다. 일반적으로 매개 변수로 전달되지는 않습니다.

규칙은 각 모듈의 맨 위에 log = logging.getLogger(__name__)을 사용하는 것입니다. __name__의 값은 각 모듈마다 다릅니다. 결과 값 __name__은 각 로그 메시지에 반영 될 수 있습니다.

관련 문제