Użyj rejestrowania wypisuje wyjście pprint

103

Chcę użyć danych wyjściowych pprint, aby pokazać złożoną strukturę danych, ale chciałbym wyprowadzić je za pomocą modułu logowania, a nie standardowego wyjścia.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT
yee379
źródło
Przejrzałem dokumenty i znalazłem pprint( {}, stream ), ale stwierdziłem, że jest to raczej niezręczne. pomyślałbym, że coś takiego spprintmogłoby być ładniejsze niż pformat(jak w c).
yee379
6
pprint.pformat()był na tej stronie.
Gareth Latty
27
@Lattywayre - Nie każdy, kto zadaje takie pytanie, pomija dokumenty. Czytałem te same dokumenty, a także brakowało formatu pformat. W przepływie stosu czasami otrzymujesz klejnoty z doświadczeń innych ludzi, których w ogóle nie było w dokumentach. Dzięki yee379 za pytanie.
Mnebuerquo

Odpowiedzi:

218

Użyj, pprint.pformataby uzyskać ciąg, a następnie wyślij go do struktury rejestrowania.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))
robert
źródło
11
Jeśli nie usuniesz tego kodu po zakończeniu debugowania, prawdopodobnie powinieneś chronić go za pomocą „if Logger.isEnabledFor (logging.DEBUG):”, aby uniknąć uruchamiania pformat, gdy nie będziesz używać jego wyniku: docs.python. org / 2 / library /…
Ed Brannin
2
@EdBrannin Czy pformat dodaje tyle narzutów, że warto dodać warunki warunkowe do wszystkich instrukcji dziennika DEBUG?
undefinedvariable
2
@undefinedvariable Dobre pytanie. Ja-dziś chce powiedzieć mi-2 lata temu, żeby wygenerować pewne wskaźniki wydajności A / B.
Ed Brannin,
1
Mam AttributeError: 'function' object has no attribute 'pformat'pojęcie, dlaczego?
JinSnow
3
rozwiązanie: potrzebowałem from pprint import pprint,pformat wtedylogging.debug((pformat(stuff))
JinSnow
20

Powyższe rozwiązanie nie do końca mi się podoba, ponieważ używam również programu formatującego do dodawania nazwy i nazwy poziomu podczas logowania. Wygląda trochę nieporządnie:

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

Może być bardziej eleganckie rozwiązanie, ale to:

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

tworzy coś ładniejszego:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text
Hywel Thomas
źródło
14
Ładniejszy do spożycia przez ludzi. Niezbyt dobre, jeśli wysyłasz logi do logstash lub podobnych narzędzi i chcesz, aby wysłano jedną wiadomość wielowierszową, a także jedną wiadomość.
Charles Duffy
5
czy jest sposób, aby ładnie wydrukować na poziomie obsługi / programu formatującego konfiguracji rejestratora? Wydaje się, że jest to ważny przypadek użycia, aby ładnie wydrukować na konsoli, ale nie sformatowano do pliku
jon_darkstar
@CharlesDuffy Czy istnieje łatwy sposób na załatwienie obu spraw?
jtlz2
2
Fwiw, moim rozwiązaniem jest dodanie dodatkowego \nznaku do formatu. Przynajmniej w ten sposób blok jest razem.
ricekab