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

  显示原文与译文双语对照的内容

我目前拥有:


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'



这就引发了 keyerrors,尽管 MYVAR 已经定义了。

是否有解决方法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



你可以使用自定义 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")



which

Jabberwocky 25/04/2013 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 方法更少的代码。


locals()


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



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

...