Utilice el registro para imprimir la salida de pprint
101
Quiero usar la salida de pprint para mostrar una estructura de datos compleja, pero me gustaría generarla usando el módulo de registro en lugar de stdout.
ds =[{'hello':'there'}]
logging.debug( pprint.pprint(ds))# outputs as STDOUT
Eché un vistazo a los documentos y lo encontré pprint( {}, stream ), pero lo encontré bastante incómodo. hubiera pensado que algo como spprintpodría haber sido mejor que pformat(como en c).
yee379
6
pprint.pformat()estaba en esa página.
Gareth Latty
27
@Lattywayre: no todos los que hacen una pregunta como esta se han saltado los documentos. Leí los mismos documentos y también me perdí pformat. En stackoverflow, a veces también obtienes gemas de la experiencia de otras personas que no estaban en los documentos en absoluto. Gracias yee379 por preguntar esto.
Mnebuerquo
Respuestas:
214
Úselo pprint.pformatpara obtener una cadena y luego envíela a su marco de registro.
from pprint import pformat
ds =[{'hello':'there'}]
logging.debug(pformat(ds))
Si no elimina este código después de haber terminado de depurar, probablemente debería protegerlo con "if Logger.isEnabledFor (logging.DEBUG):" para evitar ejecutar pformat cuando no utilice su salida: docs.python. org / 2 / library /…
Ed Brannin
2
@EdBrannin ¿Pformat agrega tanta sobrecarga que vale la pena agregar los condicionales a todas las declaraciones de registro DEBUG?
indefinido
2
@undefinedvariable Buena pregunta. Me-today quiere decirle a Me-2-years-ago que genere algunas métricas de rendimiento A / B.
Ed Brannin
1
¿Tengo AttributeError: 'function' object has no attribute 'pformat'alguna idea de por qué?
JinSnow
3
solución: necesitaba from pprint import pprint,pformat entonceslogging.debug((pformat(stuff))
JinSnow
20
La solución anterior no fue suficiente para mí porque también estoy usando un formateador para agregar nombre y nombre de nivel al iniciar sesión. Se ve un poco desordenado:
__main__ : DEBUG :['aaaaaaaaaaaaaaaaaaaa','bbbbbbbbbbbbbbbbbbbb','cccccccccccccccccccc','dddddddddddddddddddd']
__main__ : DEBUG :Some other logging text
Puede haber una solución más elegante, pero esta:
for line in pprint.pformat(ds).split('\n'):
logging.debug(line)
Más agradable para el consumo humano. No es tan bueno si está enviando registros a logstash o herramientas similares, y desea que se envíe un solo mensaje de varias líneas como, bueno, un mensaje.
Charles Duffy
5
¿Hay alguna manera de imprimir con estilo en el nivel de controlador / formateador de la configuración del registrador? Parece un caso de uso válido para imprimir bastante en la consola, pero no formatear el archivo
jon_darkstar
@CharlesDuffy ¿Existe alguna manera fácil de manejar ambos casos?
jtlz2
1
Fwiw mi solución ha sido simplemente agregar un \ncarácter adicional en el pformat. Al menos así el bloque queda unido.
pprint( {}, stream )
, pero lo encontré bastante incómodo. hubiera pensado que algo comospprint
podría haber sido mejor quepformat
(como enc
).pprint.pformat()
estaba en esa página.Respuestas:
Úselo
pprint.pformat
para obtener una cadena y luego envíela a su marco de registro.fuente
AttributeError: 'function' object has no attribute 'pformat'
alguna idea de por qué?from pprint import pprint,pformat
entonceslogging.debug((pformat(stuff))
La solución anterior no fue suficiente para mí porque también estoy usando un formateador para agregar nombre y nombre de nivel al iniciar sesión. Se ve un poco desordenado:
Puede haber una solución más elegante, pero esta:
produce algo un poco más agradable:
fuente
\n
carácter adicional en el pformat. Al menos así el bloque queda unido.