2012-01-09 3 views
5

私はいくつかのDjangoモデルをbog-standerd django.test.Testcaseでテストしています。 Django unittestsのログインをstderrに印刷するのを止めるには?

import logging 
logger = logging.getLogger(__name__) # name is myapp.models 

そして私はとログへの書き込み:私のmodels.pyには、以下のinitコードを使用して、デバッグログに書き込み、私が設定した、私のsettings.pyで

logger.debug("Here is my message") 

そのハンドラとそのハンドラのみを使用して、単一のFileHandlerとmyapp用のロガーを作成します。これは素晴らしい。私はそのログにメッセージを見る。私がDjangoシェルにいるとき、私はのみそのログへのメッセージを見ます。

しかし、テストスイートを実行すると、私のテストスイートコンソールに表示されます。それは私が明示的に定義していない別のフォーマッタを使用しており、stderrに書き出しています。 stderrに書き込むログハンドラは定義されていません。

私は本当にそれらのメッセージが自分のコンソールにスパムして欲しいとは思わない。私はそれらのメッセージを見たいと思えば私のログファイルを尾を引きます。それを止める方法はありますか? (はい、私は標準エラー出力をリダイレクトすることができますが、有用な出力にも標準エラー出力に移行する。)

編集:私は私のsettings.pyで2つのハンドラ設定しました:

'handlers': { 
    'null': { 
     'level': 'DEBUG', 
     'class': 'django.utils.log.NullHandler', 
    }, 
    'logfile' : { 
     'level':'DEBUG', 
     'class':'logging.FileHandler', 
     'filename':'%s/log/development.log' % PROJECT_DIR, 
     'formatter': 'simple' 
    }, 
}, 

をして、この試みた:

'loggers': { 
    'django': { 
     'level': 'DEBUG', 
     'handlers': ['null'] 
    }, 
    'myapp': { 
     'handlers': ['logfile'], 
     'level':'DEBUG', 
    }, 

...ただし、ロギング/ stderrダンプの動作は変わりません。テストを実行しているときに別のログハンドラを取得しているようです。

+0

testまたはruntestコマンド用に特別にロギングを設定する方法を尋ねていますか? 'settings.py'を変更しようとしましたか? –

+0

テストを実行しているときとそうでないときとで、ロギングの動作が異なります。私はそれを止めたい。私は、settings.pyのロギング設定はおそらく変更したいものだと思います。私は何を変える必要があるのか​​分かりません。運のないデフォルトの 'django'ハンドラを設定しようとしました。 – Nate

+0

私のテストメソッドの1つにいくつかのポンキングを追加すると、実際にはもっと混乱させるように見えます。私のテストでml = logging.getLogger( 'myapp.models')を実行すると、ハンドラがないように見えます(ml.handlersがそれらをリストしていると仮定します)。しかし、このコンテキストでは、ml.debug( "MESSAGE")を実行すると、ログファイルに書き込まれますが、標準エラーは書き込まれません。私は今、完全に困惑しています。 – Nate

答えて

3

あなたのconfigスニペットから、ルートロガー用に設定されているハンドラがあればそれは明らかです。 (また、Django 1.3を使用していると仮定しています。)テストを実行しているときに、ハンドラがルートロガーに追加されたことを調べて教えてください。 AFAICT Djangoは何も追加しません - あなたがimportしているコードのほうが、あなたが気づかないうちにbasicConfigの呼び出しを行うかもしれません。 ack-grepのようなものを使用して、fileConfig、dictConfig、basicConfig、およびaddHandlerが発生していないかどうかを調べます。これらのすべてがルートロガーにハンドラを追加する可能性があります。

もう1つのことを試してみてください:すべてのトップレベルのロガー( "django"のようなものですが、あなたのモジュールで使われているもの、例えば "myapp")についてはpropagateフラグをFalseに設定してください。それは物事を変えますか?

+2

Aha! '伝播'を追加する:myappのロガーにFalseがトリックでした。私はこれを試してみましたが、意外にもうまくいかなかった「プロポゲート」のスペルミスです。ありがとう! – Nate

+0

それは大きなタイプミスで、私もそれに少し気がします。 'propAgate'、* not *' propOgate' –

関連する問題