파이썬 로깅 왜 두 번 출력합니까?

제임스 린 :

로거를 설정하는 다음 코드가 있습니다.

import logging

logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO)
log = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
log.addHandler(handler)

log.info('abc')

실행하면 다음과 같은 출력이 표시됩니다.

2020-06-10 13:32:16,245 INFO: abc
abc

첫 번째 콘솔 출력이라고 가정합니까? 중복 된 것을 제거하려면 어떻게합니까?

최신 정보

답변에 감사드립니다. 이제 중복을 얻는 이유를 알고 있습니다. 기본 스트림 핸들러가 stdout으로 출력되지 않기 때문에 이런 식으로 한 이유를 알았습니다. 따라서 누군가 stdout 핸들러를 추가하는 것을 보았습니다. 따라서 2 개의 스트림 핸들러 ( 콘솔 및 stdout).

나는 이제에 대한 문서를 다시 읽었으며 basicConfig()원하는 것을 달성하는 가장 쉬운 방법을 찾았습니다.

import sys
import logging

log = logging.getLogger(__name__)
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO, stream=sys.stdout)

log.info('abc')
m :

이 호출 logging.basicConfig은 이미 스트림 핸들러를 stderr에 추가하므로 다른 스트림 핸들러를 수동으로 추가 할 이유가 없습니다. 그렇게하면 각 로그 이벤트가 stderr 및 stdout 모두에 인쇄되는 경우 터미널에 중복 출력이 발생합니다 .

스트림 핸들러가 stderr 대신 stdout을 사용 basicConfig하려면 stream또는 handlers키워드 (docs) 를 지정하여 호출을 적절하게 조정하십시오 .

정리할 수있는 다른 두 가지가 있습니다 __name__. 루트 로거를 직접 사용하지 않고 모듈 컨텍스트에 바인딩 된 로거를 사용하고 logging가져 오기시 모듈 을 구성하지 마십시오 . 가져 오기시에 로깅 시스템을 너무 열심히 구성하면 사용자 (및 테스트 스위트)는 더 이상 다르게 구성 할 수 없습니다.

import logging

# create your logger as module level global
log = logging.getLogger(__name__)

def main():
    # configure logging at entry point (so it is not configured at *import* time)
    fmt = '%(asctime)s %(levelname)s: %(message)s'
    logging.basicConfig(format=fmt, level=logging.INFO)  # streamhandler to stderr
    log.info('abc')


if __name__ == "__main__":
    main()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    화살표와 테두리가있는 CSS 전용 툴팁

  3. 3

    Windows에서 Apache Kafka 오류-주 클래스 QuorumPeerMain을 찾거나로드 할 수 없습니다.

  4. 4

    Symfony 4 Validator-유효하지 않은 경우 자동 로그 아웃

  5. 5

    Zookeeper Cluster를 시작합니다. 오류 : 주 클래스 org.apache.zookeeper.server.quorum.QuorumPeerMain을 찾거나로드 할 수 없습니다.

  6. 6

    메모리 누수를 방지하기 위해 JDBC 드라이버가 강제로 등록 해제되었습니다

  7. 7

    PyCharm에서 프로젝트를 제거하는 방법은 무엇입니까?

  8. 8

    VSOMEIP-두 장치 (TCP / UDP) 간의 통신이 작동하지 않음

  9. 9

    Maven Groovy 및 Java + Lombok

  10. 10

    OpenCV로 여러 카메라 스트림을 캡처하는 방법은 무엇입니까?

  11. 11

    Gradle 프로젝트 종속성에서 META-INF를 어떻게 제외합니까?

  12. 12

    DbCommand.ExecuteNonQueryAsync ()> 0을 사용할 때 데이터베이스에서 쿼리가 실행되지 않습니다.

  13. 13

    wildfly에 배포하면 "15 초 후 잠금을 획득 할 수 없음"예외가 발생합니다.

  14. 14

    테스트의 JUnit 4에서 실행하지만 JUnit을 5하지 - 컴파일 깨끗하지만 0 테스트 실행

  15. 15

    Python을 사용하여 Windows 네트워크의 공유 폴더에 어떻게 액세스 할 수 있습니까?

  16. 16

    r의 24 시간 시계를 인식하도록 날짜 시간 열을 어떻게 분할합니까?

  17. 17

    오픈 JDK와 AdoptOpenJDK의 차이

  18. 18

    NVMe SSD의 GFortran 비 포맷 I / O 처리량

  19. 19

    div 사이의 여유 공간을 제거하는 방법

  20. 20

    스프링 부트 액추에이터 상태 엔드 포인트 + 동적 resilience4j 회로 차단기

  21. 21

    How do I make my own website able to be installed?

뜨겁다태그

보관