2012-08-05 5 views
22

のデフォルトハンドラを交換し、私はWSGIの各要求(web2pyの)アプリケーション上で実行されている次のコードを持っている:はPythonのロガー

import logging, logging.handlers 
from logging import StreamHandler, Formatter 

def get_configured_logger(name): 

    logger = logging.getLogger(name) 

    if (len(logger.handlers) == 0): 
     # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick) 

     # === Configure logger === 

     # Create Formatted StreamHandler: 
     FORMAT = "%(process)s %(thread)s: %(message)s" 
     formatter = logging.Formatter(fmt=FORMAT) 
     handler = logging.StreamHandler() 
     handler.setFormatter(formatter) 
     logger.addHandler(handler) 
     logger.setLevel(logging.DEBUG) 
     logger.debug('CONFIGURING LOGGER') 

    return logger 

# Get app specific logger: 
logger = get_configured_logger(request.application) 
logger.debug("TEST") 

私がしたいフォーマットされたハンドラで、一度ロガーを設定するためのものです。それは私が私の標準出力に二重のエントリを取得していますことを除いて、動作します:

81893 4329050112: CONFIGURING LOGGER 
DEBUG:dummy:CONFIGURING LOGGER 
81893 4329050112: TEST 
DEBUG:dummy:TEST 

は、どのように私は私の新しいフォーマットされたハンドラを使用すると、デフォルトの1を隠す/取り除くのですか?

+0

以前このクラスを使用したことはありませんでしたが、logger.setLevel(logging.DEBUG)とlogger.debugは冗長であると思いませんか? – MiJyn

+1

lkjoel-いいえ、それは別のものです。 '.debug(..)'を呼び出すと、デバッグレベルでログエントリが作成され、ロギングレベルを設定すると、そのレベルの*ハンドル*ログエントリがハンドラに伝えられます。 – Yarin

+0

どこにでも 'logging.basicConfig'を呼び出していますか?もしそうなら、それをコメントアウトしてください。 – unutbu

答えて

35

おそらく次の例が役立ちます。基本的には、無効にしたいロガーのハンドラーを削除するか、ロギングしているロガーで伝播しないでください。

$ cat testlog.py 
import logging 
logging.basicConfig(filename='foo', level=logging.DEBUG) 
root_logger = logging.getLogger() 
root_logger.debug('bar') 

my_logger = logging.getLogger('my_logger') 
FORMAT = "%(process)s %(thread)s: %(message)s" 
formatter = logging.Formatter(fmt=FORMAT) 
handler = logging.StreamHandler() 
handler.setFormatter(formatter) 

my_logger.addHandler(handler) 
my_logger.setLevel(logging.DEBUG) 
my_logger.info('baz') 

my_logger.propagate = False 
my_logger.info('foobar') 

my_logger.propagate = True 
my_logger.info('foobaz') 
root_logger.handlers = [] 
my_logger.info('barbaz') 

$ python testlog.py 
5927 140735224465760: baz 
5927 140735224465760: foobar 
5927 140735224465760: foobaz 
5927 140735224465760: barbaz 

$ cat foo 
DEBUG:root:bar 
INFO:my_logger:baz 
INFO:my_logger:foobaz 
+7

Derek-設定 'logger.propagate = False'は私が必要としていたすべてでした.-ありがとう! – Yarin

関連する問題