0

파이썬 로깅 모듈에는 공통 패턴 (ex1, ex2)이 있습니다. 각 모듈에서 각 파이썬 모듈에 대해 새로운 로거 객체를 가져옵니다.왜 각 새 모듈에 새 로거 객체가 생깁니 까?

나는 맹목적으로 패턴을 따르는 팬이 아니므로 조금 더 이해하고 싶습니다.

왜 새 모듈마다 새 로거 객체가 생깁니 까?

누구나 동일한 루트 로거를 사용하고 %(module)s으로 포맷터를 구성하지 않는 이유는 무엇입니까?

이 패턴이 필수/필수 항목 인 경우 (즉, 성능상의 이유로 [1]) 예가 있습니까?

[1] 다중 스레드 Python 프로그램에서 여러 로깅 개체를 사용하여 해결되는 숨겨진 동기화 문제가 있습니까?

+0

관련 질문이 있지만 아마도 새로운 stackoverflow 질문이 필요합니다. 동일한 콘솔, 스트림 및/또는 파일 처리기를 사용하는 여러 로깅 개체가있는 경우 숨겨진 동기화 문제가 있습니다 (하나의 스레드 만이 한 번에 파일 하나씩)? –

+0

'logging'은 스레드 안전성을 갖도록 정의되어 있으므로 loggers *는 자신의 로그 기록을 위해 잠금을 사용합니다. 즉, 다중 스레드 환경에서 사용하는 것이 안전하다는 의미입니다. 그러나 유닉스 시스템에서 다중 처리를 사용할 때 잘 알려진 문제이다 : 기본적으로'fork '는 잠금을 복사하지 않고 드문 경우에 교착 상태를 초래할 수있다. [here] (http://stackoverflow.com/questions/24509650/deadlock-with-logging-multiprocess-multithread-python-script)를 참조하십시오. – Bakuriu

답변

1

각 로거는 개별적으로 구성 할 수 있습니다. 일반적으로 모듈 로거는 모듈 자체에 으로 설정되어 있지 않습니다. 별개 로거를 작성하고이를 사용하여 다양한 수준의 메시지를 로깅합니다. 누구든지을 사용하면 로거가 볼 메시지의 수준, 메시지를 보낼 위치 및 메시지를 표시하는 방법을 결정합니다. 그들은 하나의 모듈에있는 모든 파일 (DEBUG 이상)을 파일에 기록하고, 다른 모듈은 심각한 오류가 발생하는 경우에만주의를 기울일 수 있습니다 (이 경우 전자 메일로 직접 보내주기를 원합니다). 모든 모듈이 동일한 (루트) 로거를 사용했다면 그런 융통성을 갖지 못할 것입니다.

1

로거 이름은 응용 프로그램 이벤트에서 (논리적으로) 인 을 정의합니다. 따라서 권장 패턴은

logger = logging.getLogger(__name__) 

은 파이썬 패키지 계층을 추적하는 로거 이름을 사용합니다. 이렇게하면 특정 로거에 대해 로깅을 설정하여 자세한 정보를 위 또는 아래로 전환 할 수 있습니다. 모든 것이 루트 로거를 방금 사용한 경우 시스템이 특정 크기/복잡성에 도달 할 때 중요하게되는 상세 표시 제어를 얻을 수 없습니다.

로거 이름은 패키지 이름을 정확히 추적 할 필요가 없습니다. 예를 들어 특정 패키지에 여러 로거가있을 수 있습니다. 주된 결정 요소는 유연성 (응용 프로그램을 작성하는 경우)과 사용자가 필요로하는 유연성 (라이브러리를 작성하는 경우)이 어느 정도인지 여부입니다.

+0

"시스템이 특정 크기/복잡성에 도달했을 때": 중소형 프로그램에서는 패턴이 그렇게 중요하지 않다고 생각합니다. 그러나 당신의 복잡성/크기가 커짐에 따라 ... 패턴은 더 중요하게/필요하게됩니다. –

+0

@ TrevorBoydSmith 맞아. –

관련 문제