8

次のコードは、「ipython qtconsole」で「I want this to print」を出力しますが、プレーンな IPython では出力しません。

import logging
import logging.handlers

log = logging.getLogger()
f = logging.Formatter("%(asctime)s - %(module)s.   %(funcName)s - %(levelname)s - %(message)s")
fh = logging.handlers.TimedRotatingFileHandler('log.txt', 'W6')
fh.setFormatter(f)
log.addHandler(fh)
log.setLevel(logging.INFO)
log.info('I want this to print')

「IPython qtconsole」では、ここで説明しようとしたさまざまな問題が発生します(うまくいかなかったので、読む必要はありません!)。

理由を教えてください。

編集:私はPython 2.7を使用しています

EDIT2:本当にlogging.StreamHandlerを追加する必要があるかもしれません。

4

3 に答える 3

23

ロガーqtconsoleにハンドラーを追加するようです:root

In [1]: import logging
   ...: root = logging.getLogger()
   ...: root.handlers
   ...: 
Out[1]: [<logging.StreamHandler at 0x7fd8e00e1f98>]

通常のpythonインタープリターを使用している間、または単にipython

In [1]: import logging

In [2]: root = logging.getLogger()

In [3]: root.handlers
Out[3]: []

両方を同じように動作させたい場合はStreamHandler、通常のルート ロガーに a を追加するか、qtconsole インタープリターから をipython削除する必要があります。StreamHandler

前者が必要な場合は、次を追加します。

root = logging.getLogger()
root.addHandler(logging.StreamHandler())

後者が必要な場合は、独自のハンドラーを追加する前に、次のようにします。

for handler in root.handlers[:]:
    root.removeHandler(handler)

IPython には、ファイルにログを記録するための機構がいくつか用意されていることに注意してください。ドキュメントを参照してください。コードを ipython 内でのみ使用したい場合は、その魔法を使用する方が簡単かもしれません。

于 2014-06-17T10:50:22.640 に答える
2

Bakuriu の後者のソリューションを使用する場合、root に複数のハンドラーがあると、反復中の削除の問題により、適切に機能しません。

代わりに使用してください:

while len(root.handlers):
    root.removeHandler(root.handlers[0])
于 2015-06-19T16:58:01.750 に答える