11

私は現在持っています:

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が定義されていても、キーエラーがスローされるだけです。

回避策はありますか? MYVARは定数なので、ロガーを呼び出すたびに渡さなければならないのは残念です。

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

4

4 に答える 4

17

カスタムフィルターを使用できます:

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
于 2013-04-25T00:49:39.940 に答える
10

言うように、カスタムを使用することもFilterunutbu次を使用することもできますLoggerAdapter

import logging

logger = logging.LoggerAdapter(logging.getLogger(__name__), {'MYVAR': 'Jabberwocky'})

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")

を与える

Jabberwocky 25/04/2013 07:39:52 - 警告 - 'Twas brillig, and the slhy 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場合のアプローチよりも少なくなります。

于 2013-04-25T06:42:18.527 に答える
0
locals()
FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s'

locals() は、ローカルで利用可能なすべての変数の辞書を返し、次にエラーを返す必要があります。そこに表示されない場合は、ローカルで入手できません。これは、適切に定義されていないことを証明します。不適切に定義されているかどうかを確認するには、さらにコードが必要です。または、「globals()」を試してグローバルなものをチェックすることもできます....しかし、おそらく、FORMATを出力する定義に「global MYVAR」を入れていないでしょう。

于 2013-04-24T23:42:04.187 に答える