Use o registro de impressão da saída do pprint

99

Quero usar a saída do pprint para mostrar uma estrutura de dados complexa, mas gostaria de exibi-la usando o módulo de registro em vez de stdout.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT
yee379
fonte
Eu dei uma olhada nos documentos e encontrei pprint( {}, stream ), mas achei um tanto estranho. eu teria pensado que algo como spprintpoderia ter sido melhor do que pformat(como em c).
yee379
6
pprint.pformat()estava nessa página.
Gareth Latty
27
@Lattywayre - Nem todo mundo que faz uma pergunta como esta pulou os documentos. Eu li os mesmos documentos e também perdi o pformat. No stackoverflow, às vezes você também obtém joias da experiência de outras pessoas que não estavam nos documentos. Obrigado yee379 por perguntar isso.
Mnebuerquo

Respostas:

209

Use pprint.pformatpara obter uma string e, em seguida, envie-a para sua estrutura de registro.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
robert
fonte
11
Se você não remover este código após terminar a depuração, você provavelmente deve protegê-lo com "if Logger.isEnabledFor (logging.DEBUG):" para evitar a execução de pformat quando você não usar sua saída: docs.python. org / 2 / library /…
Ed Brannin
1
@EdBrannin O pformat adiciona tanta sobrecarga que vale a pena adicionar as condicionais a todas as instruções de log DEBUG?
variável indefinida
2
@undefinedvariable Boa pergunta. Me-today quer dizer-me-2 anos atrás para gerar algumas métricas de desempenho A / B.
Ed Brannin,
1
Eu tenho AttributeError: 'function' object has no attribute 'pformat'alguma ideia do por que
JinSnow
3
solução: eu precisava from pprint import pprint,pformat entãologging.debug((pformat(stuff))
JinSnow
20

A solução acima não bastante cortá-la para mim, porque eu também estou usando um formatador para adicionar o nome e levelname quando o log. Parece um pouco desarrumado:

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

Pode haver uma solução mais elegante, mas esta:

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

produz algo um pouco melhor:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Hywel Thomas
fonte
14
Mais agradável para consumo humano. Não é tão bom se você está enviando logs para logstash ou ferramentas semelhantes e deseja que uma única mensagem multilinha seja enviada como, bem, uma mensagem.
Charles Duffy
5
existe uma maneira de imprimir no nível do manipulador / formatador da configuração do logger? Parece ser um caso de uso válido para imprimir no console, mas não formatado para o arquivo
jon_darkstar
@CharlesDuffy Existe alguma maneira fácil de lidar com os dois casos?
jtlz2
1
Fwiw, minha solução foi apenas adicionar um \ncaractere extra no formato. Pelo menos assim o bloco fica junto.
Ricekab