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

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))

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.