2017-05-06 1 views
2

jupyter 노트북으로 파이썬 로거를 테스트하고 있습니다.파이썬 로거 - 한 번만 실행 가능

새로 시작한 커널에서 다음 예제 코드를 실행하면 올바르게 작동하는 로그 파일이 만들어지고 생성됩니다. 내가 예를 들어, 말과 같은 코드를 다시 실행하려고하면

import logging 
logging.basicConfig(filename='/home/depot/wintergreen/example.log',level=logging.DEBUG) 
logging.debug('This message should go to the log file') 
logging.info('So should this') 
logging.warning('And this, too') 

그러나, 파일 이름은 아무 일도 발생하지 않습니다, 파일 example.log2이 만들어지지 않습니다 example.log2example.log 변경.

필자는 로깅을 실행할 때 처음 실행했을 때만 작동한다는 결론을 얻었습니다. 나는 여기서 무엇을 잘못하고 있니?

+0

작품 ... – thebjorn

+0

: 일반적으로, 때마다 basicConfig()에 문제가, 그것이 좀 덜 편리하지만, 당신에게 더 많은 제어 할 수 있습니다 전체 API를 사용하는 시간을 의미 @thebjorn 당신은 jupyter 노트북에서 그것을 테스트 했습니까? –

+0

@thebjorn 질문에 두 번 언급되었습니다 –

답변

2

맞습니다. .basicConfig()kwargs을 한 번만 사용합니다. 처음 후에 당신은 당신이 제공 한 인수하여 len(root.handlers) != 0 실제 할당이 발생하지 않기 때문에 그래서

def basicConfig(**kwargs): 
    ... 
    _acquireLock() 
    try: 
     if len(root.handlers) == 0: 
      ... 
    finally: 
     _releaseLock() 

source code 보면 그렇다면 핸들러 logging.root.handlers, 실제로는 하나의 핸들러를 가지고 있기 때문에.

는 다시 시작하지 않고 변경하는 방법 :

내가 커널을 다시 시작하지 않고 .basicConfig()를 호출하여 기본 구성을 변경하기위한 것입니다 함께했다 유일한 솔루션입니다에 :

for handler in logging.root.handlers: 
    logging.root.removeHandler(handler) 

에서 모든 핸들러를 제거합니다 어느 루트 로거를 사용하면 원하는 것을 설정할 수 있습니다.

+0

ok 그래서'log.basicConfig'에 대한 변경 사항을 계정에 반영하려면 커널을 다시 시작하는 것이 해결책이라고 생각하십니까? –

+0

@jimbasquiat 아직까지 조사 중이지만'log.shutdown()'이 그렇게해야하지만 성공하지 못하기 때문에 현재로서는 유일한 옵션 인 것 같습니다. :) 내가 성공할 경우 계속 업데이트 할 것입니다. :) –

+0

@jimbasquiat 약속대로 내 대답을 업데이트했습니다. :) 테스트 해 보았습니다.) –

1

basicConfig() 함수는 한 번만 실행하도록 설계되었습니다.

문서 당 : 처음 실행될 때 기본 Formatter로 StreamHandler를 만들고이를 루트 로거에 추가합니다. 그러나 두 번째로, "함수는 루트 로거에 이미 처리기가 구성되어 있으면 아무 작업도 수행하지 않습니다".

하나의 가능한 해결 방법은 logging.root.removeHandler을 사용하여 이전 처리기를 지우는 것입니다. 또한, 직접의 StreamHandler 인스턴스에 의해 사용되는 오픈 스트림 스트림 속성에 액세스 할 수 있습니다

>>> import logging 
>>> logging.basicConfig(filename='abc.txt') # 1st call to basicConfig 
>>> h = logging.root.handlers[0]   # get the handler 
>>> h.stream.close()      # close the current stream 
>>> h.stream = open('def.txt', 'a')   # set-up a new stream 

FWIW, basicConfig()logging 모듈에 후반 추가이었고, 일반적인 경우에 대한 simplified short-cut API로 예정되었다 . 나를 위해

import logging 

# First pass 
h = logging.StreamHandler(open('abc.txt', 'a')) 
h.setLevel(logging.DEBUG) 
h.setFormatter(logging.Formatter('%(asctime)s | %(message)s')) 
logging.root.addHandler(h) 
logging.critical('The GPU is melting') 

# Later passes 
logging.root.removeHandler(h) 
h = logging.StreamHandler(open('def.txt', 'a')) 
h.setLevel(logging.DEBUG) 
h.setFormatter(logging.Formatter('%(asctime)s | %(message)s')) 
logging.root.addHandler(h) 
logging.critical('The CPU is getting hot too')