8

ロギングモジュールを理解していると思うたびに、グレムリンがやって来て、その動作方法を変更します。(わかりました、認めます、グレムリンは私のコードを変更する私かもしれません。)

私はここで何が間違っているのですか?

> ipython
> import logging
> log = logging.Logger("base")
> log.addHandler(logging.StreamHandler())

> log.critical("Hi")
Hi

> log2 = log.getChild("ment")

> log2.critical("hi")
No handlers could be found for logger "base.ment"

以前は、追加の構成なしで子ロガーを使用できたと誓ったかもしれません...

4

2 に答える 2

8

変えたら

log = logging.Logger('base')

log = logging.getLogger('base')

それは動作します:

import logging

log = logging.getLogger('base')
log.addHandler(logging.StreamHandler())
log.critical('Hi')
log2 = log.getChild('ment')
log2.critical('hi')

収量

Hi
hi
于 2012-07-27T21:56:50.977 に答える
3

詳細: モジュールの使い方が間違っています。logging.Logger():) モジュールコードを見ると、直接作成することを期待していないようです。モジュール (ex ) で直接使用できる関数と (ex ) のメソッドの多くは、インポートgetLogger()時にモジュールが作成するのインスタンスを介して実際にプロキシします。で を直接作成すると、実際にはの外部でインスタンスが作成されます。その後 を呼び出すと、モジュールは実際には 内に新しいロガーを作成しますが、ロガー名の前に外部ロガーの名前が追加されます。したがって、追加されたハンドラーはlogging.Logger()getChild()logging.ManagerLoggerlogging.Logger()LoggerManagerlog.getChild()ManagerManagerlogManager生成された子で、したがってハンドラーは機能しません。log作成前または作成後にハンドラーを追加するlog2と、ロギングのlog2動作が異なる理由については、まだ少し混乱しています。何が原因なのかわかりません...

于 2012-07-27T22:29:22.297 に答える