Usa registrazione stampa l'output di pprint


99

Voglio usare l'output di pprint per mostrare una struttura dati complessa, ma vorrei visualizzarlo usando il modulo di registrazione piuttosto che stdout.

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

Ho dato un'occhiata ai documenti e l'ho trovato pprint( {}, stream ), ma l'ho trovato piuttosto imbarazzante. avrei pensato che qualcosa di simile spprintsarebbe stato più carino di pformat(come in c).
yee379

6
pprint.pformat()era su quella pagina.
Gareth Latty

27
@ Lattywayre - Non tutti coloro che fanno una domanda come questa hanno saltato i documenti. Ho letto gli stessi documenti e ho anche perso pformat. Su stackoverflow a volte ottieni anche gemme dall'esperienza di altre persone che non erano affatto nei documenti. Grazie yee379 per averlo chiesto.
Mnebuerquo

Risposte:


209

Utilizzare pprint.pformatper ottenere una stringa e quindi inviarla al framework di registrazione.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
Se non rimuovi questo codice dopo aver terminato il debug, dovresti probabilmente proteggerlo con "if Logger.isEnabledFor (logging.DEBUG):" per evitare di eseguire pformat quando non utilizzerai il suo output: docs.python. org / 2 / library /…
Ed Brannin

1
@EdBrannin pformat aggiunge così tanto overhead che vale la pena aggiungere i condizionali a tutte le istruzioni di registro DEBUG?
variabile indefinita

2
@undefinedvariable Bella domanda. Me-today vuole dire a Me-2-years-ago di generare alcune metriche di rendimento A / B.
Ed Brannin,

1
Ho AttributeError: 'function' object has no attribute 'pformat'idea del perché?
JinSnow

3
soluzione: mi serviva from pprint import pprint,pformat alloralogging.debug((pformat(stuff))
JinSnow

20

La soluzione di cui sopra non ha del tutto tagliato per me perché sto utilizzando anche un formattatore per aggiungere nome e levelName quando la registrazione. Sembra un po 'disordinato:

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

Potrebbe esserci una soluzione più elegante, ma questa:

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

produce qualcosa di un po 'più carino:

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

14
Più bello per il consumo umano. Non è così eccezionale se stai spedendo i registri a logstash o strumenti simili e desideri che venga inviato un singolo messaggio su più righe come, beh, un messaggio.
Charles Duffy

5
c'è un modo per stampare abbastanza a livello di gestore / formattatore della configurazione del logger? Sembra un caso d'uso valido per stampare abbastanza su console, ma non formattato su file
jon_darkstar

@CharlesDuffy Esiste un modo semplice per gestire entrambi i casi?
jtlz2

1
La mia soluzione è stata quella di aggiungere semplicemente un \ncarattere in più nel formato p. Almeno in questo modo il blocco è insieme.
ricekab
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.