2013-06-14 6 views
7

Python(2.7)での初めてのロギング実験では、ロガーをすぐに作成する基本的なロギングモジュールを作成しています(モジュールごとにコンフィグレーションする必要はありません) /クラス)。Pythonロギング:デバッグレベルの情報のみを表示します

私がしたいことは、レベルINFO以上のすべてのメッセージをコンソールに表示し、すべてのDEBUGレベルの情報をテキストファイルに移動するロガーを作成することです。

これまでのところ、INFOを出力してコンソールに出力するロガーを作成し、すべてのログメッセージをテキストファイルに出力します。しかし、私はすべてのINFOとより高いメッセージをテキストファイルに入れたくありません。

私はコードを保持するPython Fiddleを作成しました。

私はチュートリアルから次のデバッグメッセージを使用:

[INFO] root: Airspeed 300 knots 
[WARNING] root: Low on fuel 
[ERROR] root: No fuel. Trying to glide. 
[CRITICAL] root: Glide attempt failed. About to crash. 

そして、私のdebug_log.txtファイル内:コンソール農産物の

log.debug('All systems operational') 
log.info('Airspeed 300 knots') 
log.warn('Low on fuel') 
log.error('No fuel. Trying to glide.') 
log.critical('Glide attempt failed. About to crash.') 

2013-06-14 14:51:46,963:DEBUG:root:All systems operational 
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots 
2013-06-14 14:51:46,964:WARNING:root:Low on fuel 
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide. 
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash. 

で上記のブロック、後の4行はファイル内にあってはなりません。私がしようとしていることは可能なのですが、どうすれば希望の結果が得られますか?

答えて

11

自分でhandler objectを作成する必要があります。

ドキュメントから:コアロギングパッケージにあるFileHandlerクラスは、ログ出力をディスクファイルに送信します。 StreamHandlerの出力機能を継承します。ここでは、FileHandlerクラスを拡張し、emit()メソッドでは、logging.DEBUGレベルにないすべてのrecordオブジェクトを除外します。私はこれをテストしていませんが、私はそれが仕事をするだろうと思う

:もちろん

from logging import FileHandler, DEBUG 
log = logging.getLogger('foo') 

class DebugFileHandler(FileHandler): 
    def __init__(self, filename, mode='a', encoding=None, delay=False) 
     FileHandler.__init__(self, filename, mode, encoding, delay) 

    def emit(self, record): 
     if not record.levelno == DEBUG: 
      return 
     FileHandler.emit(self, record) 

log.addHandler(DebugFileHandler()) 

、あなたはあなたのコードにこのコードを適応する必要があります。そして、正直言って、record.levelは野生の推測ですが、私はそれが理にかなっていると思います:-)そして、I got it right

この例では、ハンドラはfooロガーに対してのみ適用されます。必要に応じて、メインハンドラ用に、または特定のハンドラ用にのみアクティブ化することができます。

+1

私はちょうどそれを書いていました:-) – zmo

+1

ありがとう、私はコードが正確に動作するのを見なければならないでしょうが、この情報で私はそこに着きます。 :) –

+1

今後の参考として、以下を指摘しておきます。 上記のコードは主に動作します。クラスの最後にはコロンがいくつかありますが、それらは簡単に見つけられます。 'if record.level!= DEBUG:'という行を 'record.levelno == DEBUG:'に置き換えた場合、DEBUG以外のログはすべて正しくフィルタリングされます。 –

関連する問題