Günlük kaydı kullan pprint çıktısını yazdır


106

Karmaşık bir veri yapısını göstermek için pprint'in çıktısını kullanmak istiyorum, ancak bunu standart çıktı yerine günlükleme modülünü kullanarak çıkarmak istiyorum.

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

Dokümanlara baktım ve buldum pprint( {}, stream ), ancak oldukça garip buldum. Böyle bir şeyin (içinde olduğu gibi ) spprintdaha güzel olabileceğini düşünürdüm . pformatc
yee379

6
pprint.pformat()o sayfadaydı.
Gareth Latty

27
@Lattywayre - Böyle bir soru soran herkes dokümanları atlamadı. Aynı dokümanları okudum ve pformatı da kaçırdım. Stackoverflow'da bazen başkalarının deneyiminden belgelerde yer almayan değerli taşlar da elde edersiniz. Bunu sorduğunuz için teşekkürler yee379.
Mnebuerquo

Yanıtlar:


220

pprint.pformatBir dize almak için kullanın ve ardından bunu günlük çerçevenize gönderin.

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

11
Hata ayıklamayı bitirdikten sonra bu kodu kaldırmazsanız, çıktısını kullanmayacağınız zaman pformat'ı çalıştırmaktan kaçınmak için muhtemelen "if Logger.isEnabledFor (logging.DEBUG):" ile korumalısınız: docs.python. org / 2 / library /…
Ed Brannin

2
@EdBrannin pformat, tüm DEBUG günlük ifadelerine koşul ifadelerini ekleme zahmetine değecek kadar fazla yük ekler mi?
undefinedvariable

2
@undefinedvariable İyi soru. Me-today, Me-2 yıl önce bazı A / B performans ölçütleri oluşturmasını söylemek istiyor.
Ed Brannin

1
Bir AttributeError: 'function' object has no attribute 'pformat'fikrim var neden?
JinSnow

3
çözüm: from pprint import pprint,pformat O zaman ihtiyacım vardılogging.debug((pformat(stuff))
JinSnow

20

Solüsyon yukarıdaki vermedi oldukça ben de zaman günlük adını ve levelname eklemek için bir biçimlendirici kullanıyorum çünkü benim için kesti. Biraz dağınık görünüyor:

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

Daha zarif bir çözüm olabilir, ancak bu:

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

biraz daha hoş bir şey üretir:

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

14
İnsan tüketimi için daha güzel. Günlükleri logstash veya benzer araçlara gönderiyorsanız ve tek bir çok satırlı mesajın yanı sıra tek bir mesajın gönderilmesini istiyorsanız o kadar iyi değil.
Charles Duffy

5
günlükçü yapılandırmasının işleyici / biçimlendirici düzeyinde yazdırmanın bir yolu var mı? Konsola oldukça baskı için geçerli bir kullanım durumunda gibi görünüyor, ancak dosya için biçimlendirilmemiş gitmek
jon_darkstar

@CharlesDuffy Her iki durumu da halletmenin kolay bir yolu var mı?
jtlz2

2
Fwiw benim çözümüm, pformatta fazladan bir \nkarakter eklemek oldu. En azından bu şekilde blok bir arada.
ricekab
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.