Регистрация переменных данных в новой строке формата

Я использую средства ведения журнала для Python 2.7.3. Документация для этой версии Python, например, :

  

пакет ведения журнала предшествует новым параметрам форматирования, таким как str.format () и string.Template. Эти новые параметры форматирования поддерживаются ...

Мне нравится новый формат с фигурными скобками. Поэтому я пытаюсь сделать что-то вроде:

 log = logging.getLogger("some.logger")
 log.debug("format this message {0}", 1)

И получите ошибку:

  

TypeError: не все аргументы преобразованы во время форматирования строки

Что мне здесь не хватает?

P.S. Я не хочу использовать

log.debug("format this message {0}".format(1))

потому что в этом случае сообщение всегда форматируется независимо от уровня ведения журнала.

68 голосов | спросил MajesticRa 30 +04002012-10-30T04:00:38+04:00312012bEurope/MoscowTue, 30 Oct 2012 04:00:38 +0400 2012, 04:00:38

2 ответа


0

РЕДАКТИРОВАТЬ: взгляните на StyleAdapter подход в ответе @Dunes в отличие от этого ответа; это позволяет использовать альтернативные стили форматирования без шаблона при вызове методов регистратора (debug (), info (), error () и т. д.).


Из документов - Использование альтернативные стили форматирования :

  

Регистрация вызовов (logger.debug (), logger.info () и т. д.) занимает только   позиционные параметры для самого сообщения регистрации, с   параметры ключевого слова, используемые только для определения вариантов того, как обрабатывать   фактический вызов регистрации (например, параметр ключевого слова exc_info для   указать, что информация трассировки должна быть зарегистрирована, или дополнительная   параметр ключевого слова, чтобы указать дополнительную контекстную информацию, которая будет   добавлено в журнал). Таким образом, вы не можете напрямую записывать звонки, используя   str.format () или string.Template синтаксис, потому что внутри журнала   Пакет использует% -форматирование для объединения строки формата и переменной   аргументы. Там не было бы изменить это при сохранении в обратном направлении   совместимость, так как все входящие звонки, которые существуют в существующих   код будет использовать строки формата%.

и

  

Однако есть способ использовать форматирование {} и $ для   создайте ваши индивидуальные сообщения журнала. Напомним, что для сообщения вы   может использовать произвольный объект в качестве строки формата сообщения, и что   пакет logging вызовет str () для этого объекта, чтобы получить фактический   строка формата.

Скопируйте и вставьте это в модуль wherever:

class BraceMessage(object):
    def __init__(self, fmt, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

Тогда:

from wherever import BraceMessage as __

log.debug(__('Message with {0} {name}', 2, name='placeholders'))

Примечание: фактическое форматирование задерживается до тех пор, пока это не будет необходимо, например, если сообщения DEBUG не зарегистрированы, тогда форматирование вообще не выполняется.

ответил jfs 30 +04002012-10-30T04:39:53+04:00312012bEurope/MoscowTue, 30 Oct 2012 04:39:53 +0400 2012, 04:39:53
0

Более простым решением будет использование превосходного logbook модуль

import logbook
import sys

logbook.StreamHandler(sys.stdout).push_application()
logbook.debug('Format this message {k}', k=1)

Или более полный:

>>> import logbook
>>> import sys
>>> logbook.StreamHandler(sys.stdout).push_application()
>>> log = logbook.Logger('MyLog')
>>> log.debug('Format this message {k}', k=1)
[2017-05-06 21:46:52.578329] DEBUG: MyLog: Format this message 1
ответил Thomas Orozco 30 +04002012-10-30T04:11:42+04:00312012bEurope/MoscowTue, 30 Oct 2012 04:11:42 +0400 2012, 04:11:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132