Использовать ведение журнала распечатать вывод pprint

104

Я хочу использовать вывод pprint, чтобы показать сложную структуру данных, но я хотел бы выводить его с помощью модуля регистрации, а не stdout.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT
yee379
источник
Я просмотрел документы и нашел pprint( {}, stream ), но нашел это довольно неудобным. я бы подумал, что что-то вроде spprintмогло быть лучше, чем pformat(как в c).
yee379
6
pprint.pformat()был на той странице.
Gareth Latty
27
@Lattywayre - Не все, кто задает подобный вопрос, пропустили документы. Я читал те же документы, а также пропустил формат. В stackoverflow вы также иногда получаете жемчужины опыта других людей, которых вообще не было в документации. Спасибо yee379 за вопрос.
Mnebuerquo 08

Ответы:

219

Используйте, pprint.pformatчтобы получить строку, а затем отправить ее в свою платформу ведения журнала.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
Роберт
источник
11
Если вы не удалите этот код после завершения отладки, вам, вероятно, следует защитить его с помощью «if Logger.isEnabledFor (logging.DEBUG):», чтобы избежать запуска pformat, когда вы не будете использовать его вывод: docs.python. org / 2 / library /…
Эд Браннин
2
@EdBrannin Добавляет ли pformat столько накладных расходов, что стоит проблем с добавлением условий ко всем операторам журнала DEBUG?
undefinedvariable
2
@undefinedvariable Хороший вопрос. Я-сегодня хочет сказать мне-2-летней давности, чтобы я сгенерировал некоторые показатели эффективности A / B.
Эд Браннин,
1
Я понимаю, AttributeError: 'function' object has no attribute 'pformat'почему?
JinSnow
3
решение: мне from pprint import pprint,pformat тогда нужноlogging.debug((pformat(stuff))
JinSnow
20

Приведенное выше решение не совсем мне помогло, потому что я также использую форматировщик для добавления имени и имени уровня при регистрации. Выглядит немного неопрятно:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

Может быть более элегантное решение, но это:

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)

производит что-то более приятное:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Хиуэл Томас
источник
14
Лучше для человеческого потребления. Не так хорошо, если вы отправляете журналы в logstash или аналогичные инструменты и хотите, чтобы одно многострочное сообщение отправлялось как одно сообщение.
Чарльз Даффи
5
Есть ли способ красиво распечатать на уровне обработчика / форматтера конфигурации регистратора? Похоже на допустимый вариант использования для красивой печати на консоль, но без
форматирования
@CharlesDuffy Есть ли простой способ справиться с обоими случаями?
jtlz2
2
Fwiw мое решение состояло в том, чтобы просто добавить дополнительный \nсимвол в pformat. По крайней мере, так блок вместе.
riskab