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


127

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

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

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


1.0에서 작동하기 때문에 어떤 버전의 IPython을 사용하고 있습니까?
Viktor Kerkez

@ViktorKerkez가 ipython3 notebook --version반환1.0.0
Kyle Brandt

imgur.com/1b7nGZz 코드를 시도 할 때이 정보를 얻습니다.
Viktor Kerkez

@ViktorKerkez : 나중에 이해가 안 돼요, 문제를 제기해야한다고 생각합니다 ...
Kyle Brandt

답변:


129

다음을 시도하십시오.

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


4
일반 IPython 콘솔에서도 마찬가지 logger입니다. 루트 가 만들어 지지 않으면 아무 것도 인쇄하지 않습니다 .
Ioannis Filippidis

1
이 솔루션은 ipykernel4.5 에서 다시 작동합니다 (4.4 일 수도 있습니다) github.com/jupyter/notebook/issues/1397
pylang

17
더 이상 작동하지 않습니다. Jupyter Notebook 5.3.0이 아닌 경우
Wesam

64

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

16
파이썬 3에서 이것을 시도하는 누군가를 위해 : reload지금imp.reload
kuzzooroo

11
Python 3.5부터 imp 모듈이 더 이상 사용되지 않으므로 importlib.reload 를 사용해야합니다 .
Webucator

2
로거 동작을 수정하려는 모든 시도가 실패한 로깅을 사용하여 Spyder에 문제가있는 사람은 하루 종일 거위 추적을 마쳤습니다. github.com/spyder-ide/spyder/issues/2572 대단히 감사합니다!
FrenchKheldar

27

내 이해는 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 세션을 다시 시작하지 않고 이것을 다시 실행하면 두 개의 파일 핸들러가 정의되므로 파일에 중복 항목을 작성합니다.


3
이것을 "총체적으로 보이게"만들려면 코드를 파이썬 경로의 모듈에 넣고 가져옵니다. 더 예쁘고 미래에 쉽게 업그레이드 할 수 있습니다.
Alexis

1
또는 logging.config.fileConfig ( 'logging.conf')를 사용하고 모든 설정을 거기에 넣으십시오.
K.-Michael Aye

14

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!')

13

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

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

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


2
그렇습니다. 하나는 가지고 실행하는 데 basicConfig()그것을 작동하게 TP.
Brandt

11

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

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


1
StackOverflow에 오신 것을 환영합니다. 도와 주셔서 감사합니다. 설명을 추가하여 더 나은 답변을 원할 수 있습니다.
엘리아스 MP

1
이것은 실제로 가장 유용한 답변이었습니다!
IanS

1
예를 들어 몇 줄을 추가 할 수 있습니까? 로그 메시지를 인쇄하기 위해 호출하는 로거 핸들은 무엇입니까?
Wesam

최소한 ipython 7.9.0 (또는 jupyter 6.0.2)은 제안 된 코드를 무시합니다. 실행중인 콘솔 에서이 클래스를 지원하지 않기 때문입니다. %config지원되는 클래스를 보려면 실행 하십시오 Application. 여기 ipython 7.9.0.
stason

4

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

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

0

이전 버전의 ipython / jupyter에서 작동했던 솔루션이 더 이상 작동하지 않는 것 같습니다.

다음은 ipython 7.9.0 (jupyter 서버 6.0.2로 테스트 됨)의 작동 솔루션입니다.

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

DEBUG:root:test message
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.