ใช้การบันทึกการพิมพ์ผลลัพธ์ของ pprint


104

ฉันต้องการใช้เอาต์พุตของ pprint เพื่อแสดงโครงสร้างข้อมูลที่ซับซ้อน แต่ฉันต้องการส่งออกโดยใช้โมดูลการบันทึกแทนที่จะเป็น stdout

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

ฉันมองดูเอกสารและพบpprint( {}, stream )แต่พบว่ามันค่อนข้างอึดอัด ฉันคิดว่าบางอย่างspprintอาจจะดีกว่าpformat(เช่นในc)
yee379

6
pprint.pformat()อยู่ในหน้านั้น
Gareth Latty

27
@Lattywayre - ไม่ใช่ทุกคนที่ถามคำถามเช่นนี้จะข้ามเอกสารไป ฉันอ่านเอกสารเดียวกันและพลาด pformat ด้วย ใน stackoverflow บางครั้งคุณจะได้รับอัญมณีจากประสบการณ์ของคนอื่นที่ไม่ได้อยู่ในเอกสารเลย ขอบคุณ yee379 ที่ถามสิ่งนี้
Mnebuerquo

คำตอบ:


219

ใช้pprint.pformatเพื่อรับสตริงแล้วส่งไปยังกรอบการบันทึกของคุณ

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

11
หากคุณไม่ได้ลบโค้ดนี้ออกหลังจากที่คุณทำการดีบักเสร็จแล้วคุณควรป้องกันด้วย "if Logger.isEnabledFor (logging.DEBUG):" เพื่อหลีกเลี่ยงการเรียกใช้ pformat เมื่อคุณไม่ได้ใช้เอาต์พุต: docs.python org / 2 / library / …
Ed Brannin

2
@Edbrannin pformat เพิ่มค่าใช้จ่ายจำนวนมากที่คุ้มค่ากับปัญหาในการเพิ่มเงื่อนไขให้กับคำสั่งบันทึก DEBUG ทั้งหมดหรือไม่
undefinedvariable

2
@undefinedvariable คำถามที่ดี Me-today อยากจะบอก Me-2-years-ago ให้สร้างเมตริกประสิทธิภาพ A / B
เอ็ดแบรนนิน

1
ฉันAttributeError: 'function' object has no attribute 'pformat'เข้าใจว่าทำไม?
JinSnow

3
วิธีแก้ปัญหา: ฉันต้องการfrom pprint import pprint,pformat แล้วlogging.debug((pformat(stuff))
JinSnow

20

การแก้ปัญหาดังกล่าวข้างต้นไม่ได้ค่อนข้างตัดมันสำหรับฉันเพราะฉันยังมีการใช้การจัดรูปแบบเพื่อเพิ่มชื่อและ levelname เมื่อเข้าสู่ระบบ ดูเหมือนไม่เป็นระเบียบเล็กน้อย:

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

อาจมีวิธีแก้ปัญหาที่หรูหรากว่านี้ แต่สิ่งนี้:

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

สร้างสิ่งที่ดีกว่าเล็กน้อย:

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

14
ดีกว่าสำหรับการบริโภคของมนุษย์ ไม่ดีนักหากคุณจัดส่งบันทึกไปยัง logstash หรือเครื่องมือที่คล้ายกันและต้องการให้มีการส่งข้อความหลายบรรทัดด้วยกันหนึ่งข้อความ
Charles Duffy

5
มีวิธีการพิมพ์ที่สวยงามในระดับตัวจัดการ / ฟอร์แมตเตอร์ของ config logger หรือไม่? ดูเหมือนจะเป็นกรณีการใช้งานที่ถูกต้องในการพิมพ์ลงคอนโซล แต่ไม่ได้ฟอร์แมตเป็นไฟล์
jon_darkstar

@CharlesDuffy มีวิธีง่ายๆในการจัดการทั้งสองกรณีหรือไม่?
jtlz2

2
Fwiw วิธีแก้ปัญหาของฉันคือเพิ่ม\nอักขระพิเศษใน pformat อย่างน้อยวิธีนี้บล็อกก็อยู่ด้วยกัน
ricekab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.