2012-07-27 18 views
5

ログモジュールを理解すると、毎回gremlinsが入り、動作する方法を変更します。 (大丈夫、私はグレムリンが私のコードを変更するかもしれないと認めます)。子ロガーの設定

私はここで間違っていますか?あなたが変更した場合

> 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" 
私は過去に、私は、追加設定なしで子ロガーを使用することができたことを誓っている可能性が

...

+0

新しいセッションでそれを試してください。それはipythonを使用して私のために、またスクリプトとして動作します。 – unutbu

+0

cPython 2.7.2でも私のために働いていません。私は 'StreamHandler'のデフォルト設定と関係があるのか​​どうか疑問に思っています...' log'を作成し、ハンドラを 'log'に追加して' log2'を作成すると、 'ハンドラはありません。最初に 'log2'を作成してから' log'にハンドラを追加すると、 'log2'へのロギングはエラーになりません(何も印刷されません)。 –

+0

@unutbu:うーん、それは新しいセッションです。私はそれを示すために、上に 'ipython'コマンドラインを含めました。あなたが問題なくこれを実行できると、私に悪い気持ちが与えられます。私はPython 2.7.1とIPython 0.10を実行しています。そのような長い時間のために、それは問題ではないようです。私はそのコードが私のコードと関係していることを知っています。 –

答えて

5

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 
+0

私はちょうどその試みをしようとしていた...良いキャッチと助けてくれてありがとう! +1 –

+2

Argh、私はこれを追跡しました...そうです、ロギングモジュールはロガーを作成するために 'logging.Manager'を通して目に見えない形でプロキシします。 'logging.Logger()'を使って直接ロガーを作成すると、システムを短絡させてしまいます。 –

+0

私は水銀のバージョンを掘ったが、まさにそれが起こった。ロギングコードを "クリーンアップ"し、 "getLogger"ではなく "Logger"をタイプしました。 @ sr2222:原因を追いかけてくれてありがとう。なぜ失敗したのかを知るのに役立ちます。メンタルモデルを「ロギングのロードとロガーの作成」から「ロギングのロードと子ロガーの作成」に変更できるようになりました。 +1。ありがとう! –

1

より詳細な情報を得られます。あなたは、モジュールが間違って使用しています。 :)モジュールコードを見ると、logging.Logger()を直接作成するとは思わないようです。モジュール上で直接利用できる関数の多く(ex getLogger())とlogging.Logger()(ex getChild())のメソッドは、実際にモジュールがインポート時に作成するlogging.Managerのインスタンスを介してプロキシします。 Loggerlogging.Logger()と直接作成すると、Managerの外部に実際にLoggerインスタンスが作成されます。その後、log.getChild()を呼び出すと、モジュールは実際にManagerの内部に新しいロガーを作成しますが、ロガー名の前にManager - 外部ロガーの名前が追加されています。したがって、logに追加されたハンドラは、子が生成されたManagerにないため、ハンドラは機能しません。 log2の作成前または作成後にlogにハンドラを追加すると、log2に対して別の振る舞いをする理由がわかりました。私はそれを引き起こしているのを見ません...

+0

を覚えて良い: "logging.Logger()を直接、あなたが実際Managerの外部Loggerインスタンスを作成しているあなたは、その後log.getChildを(呼び出すとき)で、モジュールが実際に作成されます。マネージャー内の新しいロガー "興味深い。そして意味をなさない。 * my *プログラムの「最初の」ロガーを作成するときでも、常に「サブロガーの作成」を考えることを覚えておく必要があります。 –

関連する問題