2013-12-10 2 views
1

의 나는 두 개의 모듈에 의존하는 스크립트가 있다고 가정 해 봅시다 Main을 실행하면 Module1.py 및 Module2.py 내에 메서드에 대한 호출이 여러 번 발생합니다. 여러 모듈로 파이썬 로깅을하는 일반적인/표준 방법은 무엇입니까?</p> <ul> <li>Main.py</li> <li>Module1.py</li> <li>Module2.py</li> </ul> <p>만 Main.py이 실행되지만를 :

가 더 일반적이다

...

1) Main.py에 대한 로그에 모든 로그?

또는

2) 각 작업의 각각의 모듈에 대한 로그에 모든 로그?

(TL, 당신은 내 질문을 이해한다면 박사는 다음 그렇지 않으면, 여기에 예제에 읽을 필요가 없습니다.) : (매우 단축 코드를 사용하여)


예 :

사례 # 1에는 하나의 로그 파일 만 있습니다.이 파일을 Main.log라고합시다. 로거 이름 (그것이 비록이 예제에) 하드 코딩되지 않는다는 가정, 그래서 나는 로그 항목의 모든 AnotherMain.log에

Main.py 갈 것이다, 예를 들어 AnotherMain.py을해야합니다

some_value = Module1.get_value("abc") 
some_other_value = Module2.get_value("def") 
some_result = some_value + some_other_value 
log("main", "some_result evaluated successfully") 

Module1.py :

def get_value(key): 
    ... 
    log("main", "returning value for key from Module1") 

Module2.py :

,691,363 (210)
def get_value(key): 
    ... 
    log("main", "returning value for key from Module2") 

이 Main.log 읽기 초래 : Main.log, Module1.log, Module2.log :

some_result evaluated successfully 
returning value for key from Module1 
returning value for key from Module2 

사례 # 2 세 가지 로그 파일, 각 모듈에 대한 하나입니다.

Main.py :

some_value = Module1.get_value("abc") 
some_other_value = Module2.get_value("def") 
some_result = some_value + some_other_value 
log("main", "some_result evaluated successfully") 

Module1.py :

def get_value(key): 
    ... 
    log("Module1", "returning value for key") 

모듈 2.평가 :

def get_value(key): 
    ... 
    log("Module2", "returning value for key") 

이 한 줄이 해당 모듈 내에서 일어난 것만을 말하는 세 로그, 각 초래할 것이다.

내가 선호하는 것은 아니지만보다 표준적이고 공통적 인 질문이 아닙니다. 일단 내 후계자가 나면 처리하고 유지하는 것이 더 행복 할 것입니다.

+3

'logging' 모듈을 아직 사용하고 있습니까? –

+0

이미 로깅을 사용하고 있다고 언급 했어야합니다. 질문은 내가 각 로거 (각 모듈 당 하나씩) 또는 하나의 로거 (메인 스크립트 용으로 Module1.py와 Module2.py에서 사용)입니다. – CptSupermrkt

+0

그건 ** 전적으로 ** 귀하의 필요에 따라 다릅니다. 대부분의 프로그램은 'logging'출력을 위해 하나의 로그 파일을 사용하지만, 특정 모듈에서 더 자세한 내용이 필요하다고 느끼면 해당 모듈에 대한 포맷터와 로그 수준을 조정하는 것만으로는 충분하지 않으며 다른 모듈에 대한 메시지가 없어지면 모두 별도의 파일을 제공한다는 의미입니다. –

답변

2

가장 좋은 방법은 logging library을 사용하고 모든 것을 해당 라이브러리에 남겨 두는 것입니다.

각 모듈은 자신의 로거 사용

import logging 

log = logging.getLogger(__name__) 

# ... 
log.warn('Do not fnord the frazzle, faf the frobnir instead') 

메인 모듈의 로깅을 구성을; 원하는 경우 하나의 로그 파일을 구성하거나 특정 모듈의 출력을 특정 파일로 직접 지정할 수 있습니다.

기본적으로 로거는 모든 것을 루트 로거에 전파하지만 모듈 당 별도의 로거를 사용하면보다 복잡한 로깅 구성을 설정하려는 경우 나중에 유연하게 사용할 수 있습니다.

필요에 따라 서식을 조정하고 다른 백엔드로 로깅을 직접 지정할 수 있습니다. 포맷터에는 생성 된 메시지를 조정하는 lot of options이 있으며 로거 이름을 포함해야합니다. configuration options for formatting, filtering and handling은 거의 끝이 없습니다.

요점은 로그 파일의 수와 그 파일에 들어갈 내용은 구성입니다. 필요에 따라 구성을 변경하십시오. 간단한 것을 시작하십시오. 모든 것을 하나의 파일에 기록하고 거기서부터 진행하십시오. 각 모듈에 자체 로깅 개체를 제공하면 또는을 기본값으로 유지하고 모든 내용을 루트 처리기로 전달하도록 각 로거를 개별적으로 구성 할 수 있습니다.

+0

어쩌면 그는 어떻게 그의 시나리오를 main.py – RickyA

+0

@Martijn Pieters에서 처리기에서 제어 할 수 있는지 보여주는 예제를 추가 할 수 있습니다. 이미 이미 로깅을 사용하고 있다고 언급 했어야합니다. 문제는 getLogger ("주 스크립트 호출")를 사용합니까, 아니면 getLogger (__ name __)를 사용하여 3 개의 로거가 생성되는지입니다. – CptSupermrkt

+0

정확히 ... – RickyA