現在Jupyter
ノートブックを使用していますが、Python
ログを出力セルに強制的に出力したいと思います。
私は、おそらく古いバージョンのJupyter
ノートブックで、このように機能していた古いノートブックを使用しています。
ロギングを次のように設定しています:
import logging
logging.basicConfig(format='%(levelname)s : %(message)s', level=logging.INFO)
logging.root.level = 20
しかし、私がそれから電話するとき:
logging.info("hello world")
出力セルには何も出力されません。 Jupyter
ノートブックを起動したコンソールにあるものを印刷するだけです。
使ってます python 2.7.10
および私の仮想環境にインストールされているパッケージは次のとおりです。
appnope==0.1.0
backports-abc==0.4
backports.ssl-match-hostname==3.5.0.1
certifi==2016.2.28
decorator==4.0.9
functools32==3.2.3.post2
gnureadline==6.3.3
ipykernel==4.3.1
ipython==4.1.2
ipython-genutils==0.1.0
ipywidgets==4.1.1
Jinja2==2.8
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.2.2
jupyter-console==4.1.1
jupyter-core==4.1.0
MarkupSafe==0.23
mistune==0.7.2
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.1.0
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.6
ptyprocess==0.5.1
Pygments==2.1.3
pyzmq==15.2.0
qtconsole==4.2.0
simplegeneric==0.8.1
singledispatch==3.4.0.3
six==1.10.0
terminado==0.6
tornado==4.3
traitlets==4.1.0
wheel==0.24.0
セルのロギングプリントアウトは変更されましたか? Jupyter
に強制的にログを出力セルに書き出す方法はありますか?
jupyter
が希望どおりに機能する古いpython 2.7.10
virtualenvを見つけました。
appnope==0.1.0
backports.ssl-match-hostname==3.4.0.2
boto==2.38.0
bz2file==0.98
certifi==2015.9.6.2
decorator==4.0.4
functools32==3.2.3.post2
gensim==0.12.2
gnureadline==6.3.3
httpretty==0.8.6
ipykernel==4.1.1
ipython==4.0.0
ipython-genutils==0.1.0
ipywidgets==4.1.1
Jinja2==2.8
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.1.1
jupyter-console==4.0.3
jupyter-core==4.0.6
MarkupSafe==0.23
mistune==0.7.1
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.0.6
numpy==1.10.1
path.py==8.1.2
Pattern==2.6
pexpect==4.0.1
pickleshare==0.5
ptyprocess==0.5
Pygments==2.0.2
pyzmq==14.7.0
qtconsole==4.1.0
requests==2.8.1
scipy==0.16.0
simplegeneric==0.8.1
six==1.10.0
smart-open==1.3.0
terminado==0.5
tornado==4.2.1
traitlets==4.0.0
wheel==0.24.0
一部のパッケージは、ここでのjupyter
問題とは関係ありません。問題は、いくつかの関連パッケージのバージョンにある可能性があります。正確な場所をさらに調査してみます。
編集:
最後に、問題がパッケージにあることがわかりました:ipykernel==4.3.1
またはipykernel==4.3.0
以降、すべてがipykernel==4.1.1
またはipykernel==4.2.2
で正常に機能します。
問題はgithubでjupyterとipykernelに報告されました: https://github.com/ipython/ipykernel/issues/111
うまくいけば、jupyterの人々はこれを修正するでしょう。ただし、今のところ使用できる回避策を見つけました。新しいバージョンのjupyterノートブックでは、ノートブックにstderrが表示されないようですが、代わりにstderrを端末に送信してください。しかし、それらはまだstdoutを印刷します。ルートロガーのハンドラーをstdoutに設定できます。
import logging
import sys
# Get root logger (all other loggers will be derived from this logger's
# properties)
logger = logging.getLogger()
logger.warning("I will output to terminal") # No output in notebook, goes to terminal
# assuming only a single handler has been setup (seems
# to be default in notebook), set that handler to go to stdout.
logger.handlers[0].stream = sys.stdout
logger.warning("FOO") # Prints: WARNING:root:FOO
# Other loggers derive from the root logger, so you can also do:
logger2 = logging.getLogger("logger2")
logger2.warning("BAR") # Prints: WARNING:logger2:BAR
これをノートブックの上部に配置すると、通常、ロガーはルートロガーの設定を継承するため、この変更は、インポートするモジュールで初期化されたすべてのロガーにも反映されます。
ここで提案された回避策はどれも私にとってはうまくいきませんでしたが、以下はうまくいきました。おそらくそれは他の誰かを助けるでしょう。
python 3.4.3、jupyter-client == 4.1.1、jupyter-core == 4.0.6
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.info("hello")
情報:メイン:こんにちは
以前の回答は機能しなくなったようです。デフォルトのハンドラーがないため、最も完全なハンドラーは機能しなくなり、zeroethの変更は機能しません。また、ノートブックで実行している場合、ルートロガーをいじることは潜在的に問題があるようです。
"foo"
ロガーにその出力をセルに配置させるには、次のようにします。
logger = logging.getLogger("foo")
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
したがって、ハンドラーを自分で追加し、その出力を指示します。