日志记录模块已经部分支持您想要做的事情。做这个:
log.debug("Some message: a=%s b=%s", a, b)
...而不是这个:
log.debug("Some message: a=%s b=%s" % (a, b))
日志记录模块足够智能,不会生成完整的日志消息,除非该消息实际记录在某处。
要将此功能应用于您的特定请求,您可以创建一个惰性连接类。
class lazyjoin:
def __init__(self, s, items):
self.s = s
self.items = items
def __str__(self):
return self.s.join(self.items)
像这样使用它(注意生成器表达式的使用,增加了惰性):
logger.info('Stupid log message %s', lazyjoin(' ', (str(i) for i in range(20))))
这是一个展示其工作原理的演示。
>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logger = logging.getLogger("log")
>>> class DoNotStr:
... def __str__(self):
... raise AssertionError("the code should not have called this")
...
>>> logger.info('Message %s', DoNotStr())
Traceback (most recent call last):
...
AssertionError: the code should not have called this
>>> logger.debug('Message %s', DoNotStr())
>>>
在演示中,logger.info() 调用遇到了断言错误,而 logger.debug() 则没有达到这一点。