web-dev-qa-db-ja.com

IPython Notebookのログモジュールから出力を取得する

IPython Notebook内で次を実行すると、出力が表示されません。

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

ノートブック内に「テスト」メッセージが表示されるように、誰でも作成方法を知っていますか?

107
Kyle Brandt

以下を試してください:

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

logging.basicConfig によると:

デフォルトのFormatterでStreamHandlerを作成し、それをルートロガーに追加することにより、ロギングシステムの基本設定を行います。ルートロガーにハンドラが定義されていない場合、関数debug()、info()、warning()、error()およびcritical()はbasicConfig()を自動的に呼び出します。

この機能は、ルートロガーにハンドラーがすでに設定されている場合は何もしません。

IpythonノートブックはどこかでbasicConfig(またはset handler)を呼び出すようです。

102
falsetru

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')
57
Marigold

私の理解では、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セッションを再起動せずにこれを再実行すると、2つのファイルハンドラーが定義されるため、重複したエントリがファイルに書き込まれることに注意してください。

24
skulz00

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

%config Application.log_level="INFO"を実行してロギングを設定できます

詳細については、「 IPython kernel options 」を参照してください

7
Garvey

私のために今働いたもの(Jupyter、ノートブックサーバーは:5.4.1、IPython 7.0.1)

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

ロガーを使用して情報を印刷できるようになりました。そうでない場合は、デフォルトレベル(logging.WARNING)以上のメッセージのみが表示されます。

4
mcsim

両方のファイルのロガーをセットアップし、ノートブックに表示したかった。ファイルハンドラーを追加すると、デフォルトのストリームハンドラーがクリアされます。

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