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


104

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

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

Я просмотрел документы и нашел 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.