[python] IPython Notebook의 로깅 모듈에서 출력 받기

IPython Notebook에서 다음을 실행하면 출력이 표시되지 않습니다.

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 (또는 set handler)를 어딘가에 호출하는 것처럼 보입니다.


답변

여전히을 사용하려면 다음 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!')


답변

지금 나를 위해 일한 것 (Jupyter, 노트북 서버 : 5.4.1, IPython 7.0.1)

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

이제 로거를 사용하여 정보를 인쇄 할 수 있습니다. 그렇지 않으면 기본 수준 ( logging.WARNING) 이상의 메시지 만 표시됩니다 .


답변

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

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


답변

두 파일 모두에 대한 로거를 설정하고 노트북에 표시하기를 원했습니다. 파일 핸들러를 추가하면 기본 스트림 처리기가 지워집니다.

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")