我目前有:
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
是一个常数,所以每次调用记录器时都必须传递它是一种遗憾。
谢谢!
答案 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)
您可以使用自定义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 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)
使用此方法,不需要自定义类实现,并且您不必担心没有为各个类(LoggerAdapter
和CustomAdapter
)定义的方法,例如addHandler()
。不可否认,这可能不像Pythonic,但它对我来说是一个快速的解决方案。