developer tip

IPython 노트북의 로깅 모듈에서 출력 가져 오기

optionbox 2020. 8. 7. 08:21
반응형

IPython 노트북의 로깅 모듈에서 출력 가져 오기


IPython 노트북 내부에서 다음을 실행할 때 출력이 표시되지 않습니다.

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

누구나 노트북에서 "테스트"메시지를 볼 수 있도록 만드는 방법을 알고 있습니까?


다음을 시도하십시오.

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

logging.basicConfig 에 따르면 :

기본 Formatter를 사용하여 StreamHandler를 만들고 루트 로거에 추가하여 로깅 시스템에 대한 기본 구성을 수행합니다. 디버그 (), info (), warning (), error () 및 critical () 함수는 루트 로거에 대해 핸들러가 정의되지 않은 경우 자동으로 basicConfig ()를 호출합니다.

이 함수는 루트 로거에 이미 구성된 핸들러가있는 경우 아무 작업도 수행하지 않습니다.

ipython 노트북이 어딘가에서 basicConfig (또는 세트 핸들러)를 호출하는 것 같습니다.


여전히을 사용하려면 다음 basicConfig과 같이 로깅 모듈을 다시로드하십시오.

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')

내 이해는 IPython 세션이 로깅을 시작하므로 basicConfig가 작동하지 않습니다. 다음은 나를 위해 작동하는 설정입니다 (거의 모든 노트북에 사용하고 싶기 때문에 이것이 심하게 보이지 않기를 바랍니다).

import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)

이제 실행할 때 :

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

다음을 포함하는 노트북과 같은 디렉토리에 "mylog.log"파일이 있습니다.

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

IPython 세션을 다시 시작하지 않고 이것을 다시 실행하면 두 개의 파일 핸들러가 정의되므로 파일에 중복 항목을 작성합니다.


stderr이 logging모듈 의 기본 스트림 이므로 IPython 및 Jupyter 노트북에서 스트림을 stdout으로 구성하지 않으면 아무것도 표시되지 않을 수 있습니다.

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')

다음을 실행하여 로깅을 구성 할 수 있습니다. %config Application.log_level="INFO"

자세한 정보는 IPython 커널 옵션을 참조하십시오.


지금 저에게 도움이 된 것 (Jupyter, 노트북 서버 : 5.4.1, IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

Now I can use logger to print info, otherwise I would see only message from the default level (logging.WARNING) or above.


I setup a logger for both file and I wanted it to show up on the notebook. Turns out adding a filehandler clears out the default stream handlder.

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")

참고URL : https://stackoverflow.com/questions/18786912/get-output-from-the-logging-module-in-ipython-notebook

반응형