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))
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)
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.
pprint( {}, stream )
, mas achei um tanto estranho. eu teria pensado que algo comospprint
poderia ter sido melhor do quepformat
(como emc
).pprint.pformat()
estava nessa página.Respostas:
Use
pprint.pformat
para obter uma string e, em seguida, envie-a para sua estrutura de registro.fonte
AttributeError: 'function' object has no attribute 'pformat'
alguma ideia do por quefrom pprint import pprint,pformat
entãologging.debug((pformat(stuff))
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:
Pode haver uma solução mais elegante, mas esta:
produz algo um pouco melhor:
fonte
\n
caractere extra no formato. Pelo menos assim o bloco fica junto.