4

したがって、コマンドライン python から次のコードを実行しています。

import logging

rootLog = logging.getLogger(__name__)
rootLog.setLevel(logging.INFO)
rootLog.warning("This is a root warning")
rootLog.info("This is root info")
def info():
    log = rootLog.getChild("info")
    log.info("This is info")
    log.warning("This is a warning")
info()    

コンソールに 4 つのログ メッセージがすべて表示されることを期待していますが、表示されるのは警告だけです。何が起こっている?私は何か誤解していますか?

編集:

スクリプトの先頭に logging.basicConfig() を追加すると、期待どおりの出力が得られることがわかりました。これは奇妙です。なぜなら、Python のロギングに関するドキュメントには次のように記載されているからです。

ルート ロガーに対してハンドラーが定義されていない場合、関数debug()info()warning()error()およびcritical()が自動的に呼び出されます。basicConfig()

4

2 に答える 2

3

さて、私はロギングモジュールのコードを掘り下げました、そして私はそれを少なくとも部分的に理解したと思います。あなたが呼んrootLoggerでいるのは実際にはルートロガーではないので、あなたが見ているのは起こっていることです。確かに、でログメソッドの1つを直接呼び出すときに、ルートロガー(真のルートロガー)にハンドラーが追加されていない場合loggingは、が呼び出されますが、ここで行っているようにbasicConfigインスタンスでログメソッドを呼び出すと、Logger実際に電話basicConfigしてください。とにかく、この場合、それは実際には無関係です。:)ここで呼び出されるハンドラーがどこで作成されているかはわかりませんが、真のルートロガーに接続されていることはほぼ保証できます。真のルートロガーはデフォルトでに初期化されますWARNING。やってみてくださいlogging.root.setLevel(logging.INFO)期待どおりの結果が得られるかどうかを確認します。にロガーを手動で接続した場合にも、必要なものが表示されますrootLogger

于 2012-08-04T03:46:21.637 に答える
3

マニュアルから引用したビットは、モジュールレベル関数の下にあり、モジュール関数の場合にのみ適用されます

 logging.debug()

文字通り呼ばれます。basicConfigを使用してインスタンス メソッドを呼び出しているため、呼び出しrootLog.info()が行われず、おそらく null ロガーと通信している可能性があります。ドキュメントはちょっと混乱しています。

使用するloggging.basicConfig()と、物事が機能するはずです。

于 2012-08-04T04:10:25.850 に答える