2010-12-30 4 views
13

파이썬을 사용하여 로거를 작성하려고합니다. 2.6에서 작업 중이므로 새 사전 스타일 방법을 사용할 수 없으며 좋은 구식 구성 파일을 사용하고 있습니다. 문제는 콘솔에 두 번 출력물을 채우는 것입니다. 이유를 이해할 수 없습니다. 여기 내 테스트 스크립트는 다음과 같습니다Python Logger가 콘솔에 두 번 물건을 로깅합니다.

import logging 
import logging.config 

if __name__ == "__main__": 
    logging.config.fileConfig("newSlogger.conf") 
    slogger = logging.getLogger("sloggerMain") 

    slogger.debug("dbg msg") 
    slogger.info("herp derp dominae") 

여기 내 config 파일의 :

[loggers] 
keys=root,sloggerMain,sloggerSecondary 

[handlers] 
keys=consoleHandler,infoFileHandler,debugFileHandler 

[formatters] 
keys=consoleFormatter,infoFileFormatter,debugFileFormatter 

[logger_root] 
handlers=consoleHandler 
level=NOTSET 

[logger_sloggerMain] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerMain 

[logger_sloggerSecondary] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerSecondary 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
format=consoleFormatter 
args=(sys.stdout,) 

[handler_infoFileHandler] 
class=FileHandler 
level=INFO 
formatter=infoFileFormatter 
args=("testlog.log", "w") 

[handler_debugFileHandler] 
class=FileHandler 
level=DEBUG 
formatter=debugFileFormatter 
args=("testlogdbg.log", "w") 

[formatter_consoleFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_infoFileFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_debugFileFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

[formatter_syslogFormatter] 
format=%(name)s: %(asctime)s %(levelname)s %(message)s 
datefmt=%Y-%m-%d %H:%M:%S 

어떤 아이디어가?

답변

37
는 0으로 propagate을 설정하는 비 루트 로거를 변경

루트 로거까지 전파되는 메시지를 방지하기 위해 :

[logger_sloggerMain] 
handlers=consoleHandler,infoFileHandler,debugFileHandler 
level=DEBUG 
qualname=sloggerMain 
propagate=0 

logging 모듈의 docs 말 :

자식 로거가 전파 메시지를 최대 조상 로거 과 연결된 처리기로 보냅니다. 이 때문에 은 응용 프로그램에서 사용하는 모든 로거에 대해 처리기를 정의하고 구성 할 필요가 없습니다. 최상위 레벨의 로커에 대해 핸들러를 구성하고 이 필요한 하위 로거를 작성하는 것으로 충분합니다.

sloggerMain 로거는 root 로거의 하위 항목입니다. 디폴트에서는, 그 로거에 발행 된 메세지도 상향으로 전파됩니다.

[logger_root] 
handlers= 
:

또한 단순히 문제를 해결하기 위해 루트 로깅을 비활성화 할 수 있습니다