Verwenden Sie die Protokollierung, um die Ausgabe von pprint zu drucken

98

Ich möchte die Ausgabe von pprint verwenden, um eine komplexe Datenstruktur anzuzeigen, aber ich möchte sie lieber über das Protokollierungsmodul als über stdout ausgeben.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT
yee379
quelle
Ich blickte durch die Dokumente und fand pprint( {}, stream ), fand es aber ziemlich umständlich. Ich hätte gedacht, so etwas spprintwäre schöner gewesen als pformat(wie in c).
yee379
6
pprint.pformat()war auf dieser Seite.
Gareth Latty
27
@Lattywayre - Nicht jeder, der eine solche Frage stellt, hat die Dokumente übersprungen. Ich habe die gleichen Dokumente gelesen und auch pformat verpasst. Beim Stackoverflow erhalten Sie manchmal auch Edelsteine ​​aus der Erfahrung anderer Personen, die überhaupt nicht in den Dokumenten enthalten waren. Danke yee379, dass du das gefragt hast.
Mnebuerquo

Antworten:

208

Verwenden Sie pprint.pformatdiese Option , um eine Zeichenfolge abzurufen und diese dann an Ihr Protokollierungsframework zu senden.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
Robert
quelle
11
Wenn Sie diesen Code nach dem Debuggen nicht entfernen, sollten Sie ihn wahrscheinlich mit "if Logger.isEnabledFor (logging.DEBUG):" schützen, um zu vermeiden, dass pformat ausgeführt wird, wenn Sie die Ausgabe nicht verwenden: docs.python. org / 2 / library /…
Ed Brannin
1
@EdBrannin Fügt pformat so viel Overhead hinzu, dass es sich lohnt, die Bedingungen zu allen DEBUG-Protokollanweisungen hinzuzufügen?
undefinedvariable
2
@undefinedvariable Gute Frage. Me-today möchte Me-vor 2 Jahren mitteilen, dass einige A / B-Leistungsmetriken generiert werden sollen.
Ed Brannin
1
Ich habe AttributeError: 'function' object has no attribute 'pformat'eine Idee warum?
JinSnow
3
Lösung: Ich brauchte from pprint import pprint,pformat dannlogging.debug((pformat(stuff))
JinSnow
20

Die obige Lösung hat es für mich nicht ganz gekürzt, da ich beim Protokollieren auch einen Formatierer verwende, um Namen und Ebenennamen hinzuzufügen. Es sieht etwas unordentlich aus:

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

Es mag eine elegantere Lösung geben, aber diese:

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

produziert etwas ein bisschen schöner:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Hywel Thomas
quelle
14
Schöner für den menschlichen Verzehr. Nicht so toll, wenn Sie Protokolle an Logstash oder ähnliche Tools senden und möchten, dass eine einzelne mehrzeilige Nachricht sowie eine Nachricht gesendet wird.
Charles Duffy
5
Gibt es eine Möglichkeit, auf der Handler- / Formatiererebene der Logger-Konfiguration hübsch zu drucken? Scheint ein gültiger Anwendungsfall zu sein, um hübsch auf der Konsole zu drucken, aber unformatiert in die Datei zu gehen
jon_darkstar
@CharlesDuffy Gibt es eine einfache Möglichkeit, beide Fälle zu behandeln?
jtlz2
1
Meine Lösung bestand darin, \ndem pformat nur ein zusätzliches Zeichen hinzuzufügen. Zumindest so ist der Block zusammen.
Ricekab