Вот еще один вариант, в котором нет проблем с ключевыми словами, упомянутых в ответе Дюны. Он может обрабатывать только {0}
аргументы positional ( ), но не аргументы keyword ( {foo}
). Также не требуется двух вызовов форматирования (с использованием подчеркивания). У него есть фактор подкласса str
:
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
Вы используете это так:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Конечно, вы можете удалить отметку, отмеченную значком, # optional
чтобы заставить все сообщения, проходящие через адаптер, использовать форматирование нового стиля.
Примечание для тех, кто читает этот ответ спустя годы : начиная с Python 3.2 , вы можете использовать параметр стиля с Formatter
объектами:
Ведение журнала (начиная с версии 3.2) обеспечивает улучшенную поддержку этих двух дополнительных стилей форматирования. Класс Formatter был расширен и теперь принимает дополнительный необязательный параметр ключевого слова с именем style
. По умолчанию это '%'
, но другие возможные значения - '{'
и '$'
, которые соответствуют двум другим стилям форматирования. Обратная совместимость поддерживается по умолчанию (как и следовало ожидать), но, явно указав параметр стиля, вы получаете возможность указать строки формата, которые работают с str.format()
или
string.Template
.
Документы предоставляют пример
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Обратите внимание, что в этом случае вы по-прежнему не можете вызвать logger
с новым форматом. Т.е. по-прежнему не сработает следующее:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)