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
yee379
fuente
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))
robert
fuente
11
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)

produce algo un poco más agradable:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Thomas Hywel
fuente
14
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.
Ricekab