2011-09-15 6 views
10

은 다음과 같습니다 코드 라인의 수천이있다 : 나는 모든 라인을 변경하지 않으재정의 로깅 루트 로거

logging.info("bla-bla-bla") 

,하지만 난 로그 동작을 변경합니다. 내 생각은 INI 파일로 구성되어 다른 Experimental 로거에 루트 로거를 변화 :

이제 새로운 루트 로거를 설정하는 것은이 코드 조각에 의해 이루어집니다
[loggers] 
keys = Experimental 

[formatter_detailed] 
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s 

[handler_logfile] 
class = FileHandler 
args = ('experimental.log', 'a') 
formatter = detailed 

[logger_Experimental] 
level = DEBUG 
qualname = Experimental 
handlers = logfile 
propagate = 0 

:

logging.config.fileConfig(path_to_logger_config) 
logging.root = logging.getLogger('Experimental') 

가의 재정의 루트 로거는 안전합니까? 어쩌면 더 편리한 방법이 있을까요?

Google을 사용해 보았고 stackoverflow 질문을 검토했지만 대답을 찾지 못했습니다.

+0

먼저. 이게 효과가 있었나요? 실제 문제가 있습니까? 둘째. "보다 편리하게"정의하십시오. 두 줄의 코드가 매우 편리합니다. 얼마나 더 편리할까요? –

+0

그것은 작동합니다! 그러나 나는 이것이 해킹처럼 보인다고 생각합니다. "보다 편리하게"는 "로깅 모듈의 표준 기능 사용"을 의미합니다. 죄송합니다. –

+0

좋은 사람! 서식 설정이 멋지다. –

답변

11

이 아닌은 사용자가 설명하는 방식으로 루트 로거를 재정의하는 것이 좋습니다. 일반적으로 당신은 단지 작은 스크립트를 직접 루트 로거를 사용한다 - 큰 애플리케이션을 위해, 가장 좋은 방법은 등) (로깅을 사용하는 각 모듈에

logger = logging.getLogger(__name__) 

을 사용하고 Logger.INFO로하는 통화를 할 수있다

파일에 로그 만 남기고 싶다면 루트 로거에 파일 처리기를 추가하는 것이 좋습니다. 예를 들면 다음과 같이 할 수 있습니다.

if __name__ == '__main__': 
    logging.basicConfig(filename='experimental.log', filemode='w') 
    main() # or whatever your main entry point is called 

또는 구성 파일을 통해.

업데이트 : "당신이 조언이야"당신은 당신의 시나리오에서 어떤 문제로 실행되지 않을 수 있지만, 내가 ;-)이 답변 여기에 날에 의해 의미 말할 때, 그것은 모듈을 덮어하지 않는 것이 좋습니다입니다 속성을 덮어 쓰도록 설계되지 않았습니다. 예를 들어, 루트 로거는 다른 클래스 (공용 API의 일부가 아님)의 인스턴스이며, 이전 값을 여전히 가리키는 로깅 메커니즘에 대한 다른 참조가 있습니다. 이 두 가지 사실 중 하나는 디버그하기 힘든 문제로 이어질 수 있습니다. 로깅 패키지는 원하는 것 (외관상 콘솔이 아닌 파일에 로깅)을 달성하는 여러 가지 방법을 제공하므로 제공된 메커니즘을 사용해야합니다.

+0

"네가 조언을 받았어 ..."어디서? 이것으로 인해 발생한 문제는 무엇입니까? 나머지는 "일반적으로 ..."우수합니다.그러나 첫 번째 문장은 몇 가지 뒷받침되는 증거 또는 문서화의 혜택을 볼 것입니다. –

+0

'logging.root'는'logging.Logger'가 아닌'logging.RootLogger' 클래스입니다. 이러한 클래스는 대부분 같은 방식으로 작동하지만 경우에 따라 다른 동작이 발생할 수 있습니다. 또한 일부 유형 검사기는 경고를 발생시킬 수 있습니다. – DarksteelPenguin

1

logger = logging.getLogger() 이름을 비워두면 루트 로거가 반환됩니다.

logger = logging.getLogger('name') 다른 로거를 제공합니다.