2017-11-22 5 views
0

고유 한 로거와 인스턴스를 자체로 처리하는 코드 조각을 만들고 있습니다.파이썬 2 로거는 기본 로거 사용 후 줄을 반복합니다.

로깅 모듈을 직접 사용하는 라이브러리를 추가하여 로거를 망가 뜨립니다. - 원본 로거는 기본 로거가 전혀 인쇄하지 않는 동안 각 행을 다른 형식으로 두 번 인쇄하기 시작합니다.

제안 사항? MCVE :

import sys 
import logging 
log = logging.getLogger('foo') 
log.addHandler(logging.StreamHandler(sys.stdout)) 
log.setLevel(logging.DEBUG) 

log.info("works once") 
logging.info("Isn't printed") 
log.info("printed twice with different format") 

출력 : 그것은 또한 기본 로거처럼 보일 나던

works once 
printed twice with different format 
INFO:foo:printed twice with different format 

어떻게 든 내 로거 인스턴스에 추가 핸들러를 추가합니다

> print log.handlers 
[<logging.StreamHandler object at 0x7f5d14314990>] 

나는 변경할 수 없습니다 모듈을 포함 시켰습니다 ...

답변

0

파고 파기 한 후에 마침내 do 나를 구한 증거!

Logger.propagate

이이에 첨부 된 핸들러에 추가하여 더 높은 수준 (상위) 로거의 핸들러에 전달 될이 로거에 기록 된 사실, 사건, 평가되면 나무꾼. 메시지는 상위 시스템 로거의 처리기로 직접 전달됩니다. 레벨이나 해당 조상 로거의 필터는 고려하지 않습니다.

이 값이 false로 평가되면 로깅 메시지가 상위 로거의 처리기 으로 전달되지 않습니다.

생성자는이 특성을 True로 설정합니다.

설정 log.propagate = False 내 불행이 끝났습니다.

logging.info을 통한 기본 로거의 첫 번째 사용이 기본 로거를 초기화했으며 그 순간부터 전파가 영향을 미치기 시작한 것으로 보입니다.

+2

가능한 경우 사용하는 라이브러리에서 버그 보고서를여십시오. 라이브러리는 로깅 요구에 루트 로거를 사용하지 않아야합니다. 직면 한 것과 같은 문제가 발생할 것입니다. 라이브러리는 자체 로거 ('getLogger()')를 생성하고 거기에'NullHandler'를 첨부해야합니다. – m1keil