如何在记录器格式化程序中输入变量?

2024-09-28 17:17:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有:

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是一个常量,因此每次调用记录器时都必须传递它是一个遗憾。

谢谢你!


Tags: formatmessageloggingfilenameleveloptionslogfileloglevel
3条回答
locals()
FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s'

locals()应该返回本地可用的所有变量的字典,然后返回错误。 如果你在那里看不到它,那么它在本地是不可用的。这将证明它的定义不正确。我们需要更多的代码来查看它的定义是否不正确。或者您可以尝试“globals()”来检查全局的。。。。但是您可能没有将“global MYVAR”放在输出格式的定义中

您可以使用定制的Filter,正如unutbu所说,也可以使用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 2013年4月25日07:39:52-警告-“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方法少。

您可以使用custom filter

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

相关问题 更多 >