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


127

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

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

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


これは1.0で動作するため、使用しているIPythonのバージョンは何ですか?
Viktor Kerkez 2013

@ViktorKerkez ipython3 notebook --versionが復帰1.0.0
カイル・ブラント

imgur.com/1b7nGZz私はあなたのコードを試したときにこれを取得します。
Viktor Kerkez 2013

@ViktorKerkez:わかりません。問題を報告する必要があると思います...
カイルブラント

回答:


129

以下を試してください:

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

logging.basicConfigによると:

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

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

どこかでipythonノートブックがbasicConfig(またはsetハンドラー)を呼び出すようです。


4
通常のIPythonコンソールでも同じことが起こりますlogger。ルートが作成されない限り、何も出力されません。
Ioannis Filippidis 2014年

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
これをPython 3で実行しようとしている人のために:reload今すぐimp.reload
kuzzooroo

11
Python 3.5以降では、impモジュールが廃止されるため、importlib.reloadを使用する必要があります。
Webucator 2015年

2
ロギングでSpyderに問題が発生している場合(ロガーの動作を変更する試みがすべて失敗した場合)、これは1日のガチョウ追跡を終えただけです。github.com/spyder-ide/spyder/issues/2572ありがとうございます!
FrenchKheldar 2018

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


3
これを「全体的に見える」ものにするには、コードをpythonパス上のモジュールに入れてインポ​​ートします。きれいで、将来のアップグレードが簡単です。
アレクシス2016年

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それらの1つではありません。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.