복붙노트

[PYTHON] 파이썬 로그로 두 번 나타나는 로그 메시지

PYTHON

파이썬 로그로 두 번 나타나는 로그 메시지

파이썬 로깅을 사용하고 있으며, 어떤 이유로 모든 메시지가 두 번 나타나고 있습니다.

로깅을 구성하는 모듈이 있습니다.

# BUG: It's outputting logging messages twice - not sure why - it's not the propagate setting.
def configure_logging(self, logging_file):
    self.logger = logging.getLogger("my_logger")
    self.logger.setLevel(logging.DEBUG)
    self.logger.propagate = 0
    # Format for our loglines
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    # Setup console logging
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    ch.setFormatter(formatter)
    self.logger.addHandler(ch)
    # Setup file logging as well
    fh = logging.FileHandler(LOG_FILENAME)
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    self.logger.addHandler(fh)

나중에이 메서드를 호출하여 로깅을 구성합니다.

if __name__ == '__main__':
    tom = Boy()
    tom.configure_logging(LOG_FILENAME)
    tom.buy_ham()

그리고 나서, buy_ham 모듈에서, 저는 전화를했습니다 :

self.logger.info('Successfully able to write to %s' % path)

그리고 어떤 이유로 모든 메시지가 두 번 나타나고 있습니다. 스트림 처리기 중 하나를 주석 처리했지만 여전히 똑같습니다. 별난 사람의 작은 조각 (왜 이것이 일어나고 있는지에 관해 명확히하지 않는다. .. 축 늘어져 라. 나는 명백한 것을 놓쳤다 고 가정한다.

건배, 승리자

해결법

  1. ==============================

    1.configure_logging을 두 번 호출하고 있습니다 (아마도 Boy의 __init__ 메소드에서). getLogger는 동일한 객체를 반환하지만 addHandler는 유사한 핸들러가 이미 로거에 추가되었는지 확인하지 않습니다.

    configure_logging을 두 번 호출하고 있습니다 (아마도 Boy의 __init__ 메소드에서). getLogger는 동일한 객체를 반환하지만 addHandler는 유사한 핸들러가 이미 로거에 추가되었는지 확인하지 않습니다.

    해당 메소드에 대한 호출을 추적하고 이들 중 하나를 제거하십시오. Boy의 __init__ 메소드에서 False로 초기화 된 logging_initialized 플래그를 설정하고 logging_initialized가 True이면 configure_logging을 변경하여 아무것도 로깅하지 않으며 로거를 초기화 한 후에 True로 설정하십시오.

    프로그램이 여러 개의 Boy 인스턴스를 생성하는 경우 글로벌 configure_logging 함수로 핸들러를 추가하는 방법과 self.logger 속성을 초기화하는 Boy.configure_logging 메소드 만 변경해야합니다.

    이것을 해결하는 또 다른 방법은 로거의 핸들러 속성을 확인하는 것입니다.

    logger = logging.getLogger('my_logger')
    if not logger.handlers:
        # create the handlers and call logger.addHandler(logging_handler)
    
  2. ==============================

    2.핸들러는 외부에서 전화 할 때마다 추가됩니다. 작업을 마친 후에 핸들러 제거를 시도하십시오.

    핸들러는 외부에서 전화 할 때마다 추가됩니다. 작업을 마친 후에 핸들러 제거를 시도하십시오.

    self.logger.removeHandler(ch)
    
  3. ==============================

    3.저는 파이썬 초보자입니다. 그러나 이것은 저에게 효과적이었습니다 (Python 2.7).

    저는 파이썬 초보자입니다. 그러나 이것은 저에게 효과적이었습니다 (Python 2.7).

    while logger.handlers:
         logger.handlers.pop()
    
  4. ==============================

    4.이 문제가 발생하고 처리기를 두 번 추가하지 않으면 abarnert의 대답을 참조하십시오.

    이 문제가 발생하고 처리기를 두 번 추가하지 않으면 abarnert의 대답을 참조하십시오.

    문서에서 :

    따라서 "test"에 대한 커스텀 핸들러를 원한다면, 그 핸들러가 루트 핸들러로가는 것을 원치 않는다면 대답은 간단합니다 : propagate 플래그를 끄십시오 :

    logger.propagate = False

  5. from https://stackoverflow.com/questions/6729268/log-messages-appearing-twice-with-python-logging by cc-by-sa and MIT license