2013-04-24 7 views
5

私は現在持っている:ロガーフォーマッタで変数を入力する方法は?

FORMAT = '%(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S', filename=LOGFILE, level=getattr(logging, options.loglevel.upper())) 

...素晴らしい作品これは、しかし、私がやろうとしている:

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

だけMYVARが定義されていてもkeyerrorsを投げること。

回避策はありますか? MYVARは定数なので、ロガーを呼び出すすべてを渡す必要があるのは残念です。

ありがとうございました!

+2

'MYVAR'が常に同じ値を持つ場合、' FORMAT = '{}%(asctime)s - %(レベル名)s - %(メッセージ)s'.format(MYVAR) 'a可能な代替案? –

答えて

10

を出力定義で「グローバルMYVAR」を入れてアレント:

import logging 

MYVAR = 'Jabberwocky' 


class ContextFilter(logging.Filter): 
    """ 
    This is a filter which injects contextual information into the log. 
    """ 
    def filter(self, record): 
     record.MYVAR = MYVAR 
     return True 

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') 

logger = logging.getLogger(__name__) 
logger.addFilter(ContextFilter()) 

logger.warning("'Twas brillig, and the slithy toves") 

を利回り

Jabberwocky 24/04/2013 20:57:31 - WARNING - 'Twas brillig, and the slithy toves 
+0

本当にありがとうございます。 –

+0

python 2.7で動作しません。解決策は、 'ContextFilter()'をハンドラに追加することです。 – mmoya

0
locals() 
FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

locals()はローカルで使用可能なすべての変数の辞書を返す必要があります。 そこに表示されない場合は、ローカルでは使用できません。これは、正しく定義されていないことを証明します。それが不適切に定義されているかどうかを確認するには、より多くのコードが必要になります。別の方法としては、「グローバル()」グローバルなものをチェックするために試すことができます....しかし、あなたはおそらくあなたがcustom filter使用することができFORMAT

+0

私は地元の人たちに印刷を試みました。出力の一部として私のvarを見ることができます: 'MYVAR': 'blahblah' –

5

unutbuが言うようにあなたは、カスタムFilterを使用することができ、またはあなたがLoggerAdapter使用できます。

にジャバウォック25/04/2013 7時39分52秒を与える - WARNING - 「TWAS brillig、およびslithyだけで、すべてのコールで情報を渡し、また

をtoves:

import logging 

logger = logging.getLogger(__name__) 

FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 
logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') 

logger.warning("'Twas brillig, and the slithy toves", extra={'MYVAR': 'Jabberwocky'}) 

これは同じ結果を与える。

MYVARは実質的に一定であるため、LoggerAdapterアプローチでは、Filterアプローチよりもコードが少なくて済みます。

+0

'' logging.basicConfig(format = FORMAT) ''はすべてのロガーのフォーマットを変更しますか?この新しいロガーアダプターのためだけに変更するには?ありがとう – Michael

関連する問題