日志记录模块已经部分支持您想要执行的操作。这样做:
log.debug("Some message: a=%s b=%s", a, b)
... 而不是这个:
log.debug("Some message: a=%s b=%s" % (a, b))
日志记录模块足够聪明,不会产生完整的日志消息,除非该消息实际记录在某处。
要将此功能应用于您的特定请求,您可以创建一个lazyjoin 类。
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() 没有达到那么远。