2009-05-18 8 views
24

私は、ログを記録するためにロギング(インポートロギング)を使用しています。フィルタを使用したログ

1つのモジュール内で、デバッグレベル(my_logger.debug( 'msg'))でメッセージをロギングしています。

これらのデバッグメッセージの一部は、function_a()およびfunction_b()のものです。 私はaかbから来ているかどうかに基づいてロギングを有効/無効にしたいと思っています。

私は、Loggingのフィルタリングメカニズムを使用する必要があると推測しています。

誰かが、私が欲しいことをするために、以下のコードをどのように装備する必要があるか教えてください。ありがとう。

import logging 
logger= logging.getLogger("module_name") 

def function_a(...): 
    logger.debug("a message") 

def function_b(...): 
    logger.debug("another message") 

if __name__ == "__main__": 
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) 

    #don't want function_a()'s noise -> .... 
    #somehow filter-out function_a's logging 
    function_a() 

    #don't want function_b()'s noise -> .... 
    #somehow filter-out function_b's logging 
    function_b() 

私はより多くのモジュールとモジュールあたりよりのfuncsにこの簡単な例をスケーリングした場合、私はロガーの多くを心配するだろう。

モジュールあたり1ロガーに抑えることはできますか?ログメッセージは構造化されていることに注意してください。つまり、関数が何らかの解析作業を行っている場合、それらはすべて接頭辞logger.debug( "parsing:xxx")を含んでいます。メッセージを出すモジュール/機能に関係なく、すべての「解析」メッセージをオフにします。

答えて

36

logging.Filterhttp://docs.python.org/library/logging.html#filter-objectsのサブクラスを実装するだけです。 1つのメソッドfilter(record)があり、ログレコードを検査し、それを記録するにはTrueを、それを破棄するにはFalseを返します。次にaddFilter(filter)メソッドを呼び出すことによってLoggerまたはHandlerにフィルタをインストールできます。

例:とにかく

class NoParsingFilter(logging.Filter): 
    def filter(self, record): 
     return not record.getMessage().startswith('parsing') 

logger.addFilter(NoParsingFilter()) 

またはそのような何か、。

+6

ハンドラにフィルタを追加する必要がありました。 –

15

グローバルは使用しないでください。それは起こるのを待っている事故です。

ロガーに意味のある「。」で区切られた名前を付けることができます。

階層として制御できます。 a.b.ca.b.dのロガーがある場合は、ログレベルをa.bで確認して両方のロガーを変更できます。

ロガーをいくつでも使用できます - 安価です。

最も一般的な設計パターンはモジュールあたり1ロガーです。 Naming Python loggers

を参照してください。

import logging 

logger= logging.getLogger("module_name") 
logger_a = logger.getLogger("module_name.function_a") 
logger_b = logger.getLogger("module_name.function_b") 

def function_a(...): 
    logger_a.debug("a message") 

def functio_b(...): 
    logger_b.debug("another message") 

if __name__ == "__main__": 
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) 
    logger_a.setLevel(logging.DEBUG) 
    logger_b.setLevel(logging.WARN) 

    ... etc ... 
+1

返信いただきありがとうございました。これはうまくいくでしょう。しかし、単純な例をより多くのモジュールに拡張し、モジュールごとに機能を増やすと、ロガーの数が多くなることに懸念があります。モジュールごとに1ロガーに抑えることができますか?ログメッセージは「構造化」されていることに注意してください。つまり、ログを記録している関数が何らかの解析作業を行っている場合、それらはすべて接頭辞logger.debug( "parsing:...")を含んでいます。すべての "解析"メッセージを遮断するだけです(メッセージを発信するモジュール/機能に関係なく) –