Как указывает Шейн, используя
log.debug("Some message: a=%s b=%s", a, b)
... вместо этого:
log.debug("Some message: a=%s b=%s" % (a, b))
экономит время, выполняя форматирование строки, только если сообщение действительно зарегистрировано.
Однако это не решает проблему полностью, поскольку вам, возможно, придется предварительно обработать значения для форматирования в строку, например:
log.debug("Some message: a=%s b=%s", foo.get_a(), foo.get_b())
В этом случае obj.get_a()
и obj.get_b()
будут вычислены даже , если не ведется регистрация.
Решением этой проблемы было бы использование лямбда-функций, но для этого требуется дополнительный механизм:
class lazy_log_debug(object):
def __init__(self, func):
self.func = func
logging.debug("%s", self)
def __str__(self):
return self.func()
... тогда вы можете войти со следующим:
lazy_log_debug(lambda: "Some message: a=%s b=%s" % (foo.get_a(), foo.get_b()))
В этом случае лямбда-функция будет только вызываться, если log.debug
решит выполнить форматирование, следовательно, вызовет метод __str__
.
Имейте в виду: издержки этого решения могут значительно превысить выгоду :-) Но, по крайней мере, теоретически, это позволяет вести ленивую регистрацию.