Да, он должен выполнять дополнительную работу, когда вы делаете это таким образом, создавая строки, которые никогда не будут использоваться.Тем не менее, небольшой взлом позволит вам переключиться на лениво отформатированные сообщения.
Люди Python предоставляют , как направлять для переключения, либо используя класс-оболочку с __str__
это вызывается только в том случае, если регистрация действительно происходит, или с использованием оболочки LoggerAdapter
для подкласса для регистратора, который выполняет ленивое форматирование фигурных скобок (поэтому во время использования вообще никакого лишнего kruft нет).Последний подход является наиболее чистым во время использования.Вот простой пример из руководства:
import logging
class Message(object):
def __init__(self, fmt, args):
self.fmt = fmt
self.args = args
def __str__(self):
return self.fmt.format(*self.args)
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra or {})
def log(self, level, msg, *args, **kwargs):
if self.isEnabledFor(level):
msg, kwargs = self.process(msg, kwargs)
self.logger._log(level, Message(msg, args), (), **kwargs)
logger = StyleAdapter(logging.getLogger(__name__))
def main():
logger.debug('Hello, {}', 'world!')
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
main()
В реальном коде Message
и StyleAdapter
, вероятно, будут скрыты в отдельном модуле, оставляя очень мало пользовательского кода в модулях, которые используютим.