如何在logger格式化程序中输入变量?

时间:2013-04-24 23:23:31

标签: python logging

我目前有:

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

谢谢!

4 个答案:

答案 0 :(得分:11)

您可以使用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

答案 1 :(得分:5)

您可以使用自定义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,以及狡猾的行动

或者,只需在每次通话时传递信息:

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方法。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

借用上面的评论,我发现当变量对​​所有日志条目都是静态时,最简单的方法就是将它包含在格式化程序本身中:

FORMAT = '{} %(asctime)s - %(levelname)s - %(message)s'.format(MYVAR)

使用此方法,不需要自定义类实现,并且您不必担心没有为各个类(LoggerAdapterCustomAdapter)定义的方法,例如addHandler()。不可否认,这可能不像Pythonic,但它对我来说是一个快速的解决方案。