लॉग आउटपुट प्रिंट का उपयोग करें


99

मैं एक जटिल डेटा संरचना दिखाने के लिए pprint के आउटपुट का उपयोग करना चाहता हूं, लेकिन मैं इसे stdout के बजाय लॉगिंग मॉड्यूल का उपयोग करके आउटपुट देना चाहूंगा।

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

मैंने डॉक्स के माध्यम से नज़र डाली और पाया pprint( {}, stream ), लेकिन यह अजीब पाया। मुझे लगता है कि कुछ इस तरह spprintसे pformat(जैसे c) से अच्छा हो सकता है ।
yee379

6
pprint.pformat()उस पेज पर था।
गारेथ लैट्टी

27
@ लिट्टीवेरे - इस तरह का प्रश्न पूछने वाले हर व्यक्ति ने डॉक्स को छोड़ नहीं दिया है। मैंने वही डॉक्स पढ़े और साथ ही पोफोर्मेट भी याद किया। स्टैकओवरफ्लो पर आपको कभी-कभी अन्य लोगों के अनुभव से भी रत्न मिलते हैं जो डॉक्स में बिल्कुल भी नहीं थे। यह पूछने के लिए धन्यवाद yee379
Mnebuerquo

जवाबों:


209

pprint.pformatएक स्ट्रिंग प्राप्त करने के लिए उपयोग करें , और फिर इसे अपने लॉगिंग ढांचे में भेजें।

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

11
यदि आप डीबगिंग करने के बाद इस कोड को नहीं निकालते हैं, तो आपको संभवतः "अगर Logger.isEnabledFor (logging.DEBUG):" के साथ इसकी रखवाली करनी चाहिए: "जब आप इसके आउटपुट का उपयोग नहीं करेंगे तो dform.python चलाने से बचें । org / 2 / पुस्तकालय /…
एड Brannin

1
@EdBrannin क्या pformat उस ओवरहेड को जोड़ देता है जो सभी DEBUG लॉग स्टेटमेंट में सशर्त जोड़ने की परेशानी के लायक है?
अपरिभाषित

2
@undefinedvariable अच्छा प्रश्न। मी-आज कुछ ए / बी परफॉर्मेंस मेट्रिक्स जेनरेट करने के लिए मुझे 2-साल पहले बताना चाहता है।
एड ब्रानिन

1
मुझे AttributeError: 'function' object has no attribute 'pformat'कोई विचार आता है क्यों?
जिनसो

3
समाधान: मुझे from pprint import pprint,pformat तब की आवश्यकता थीlogging.debug((pformat(stuff))
जिन्सन

20

ऊपर दिए गए समाधान ने मेरे लिए इसे बहुत कम नहीं किया क्योंकि मैं लॉगिंग करते समय नाम और स्तरनाम जोड़ने के लिए एक फॉर्मेटर का उपयोग कर रहा हूं। यह थोड़ा अस्वाभाविक लगता है:

__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
मानव उपभोग के लिए अच्छे। यदि आप लॉगस्टैश या इसी तरह के औजारों के लिए लॉग्स को शिपिंग कर रहे हैं तो यह बहुत अच्छा नहीं है, और चाहते हैं कि एक एकल बहुस्तरीय संदेश को भी भेजा जाए।
चार्ल्स डफी

5
वहाँ लकड़हारा विन्यास के हैंडलर / फ़ॉर्मेटर स्तर पर सुंदर प्रिंट करने का एक तरीका है? सांत्वना के लिए सुंदर प्रिंट करने के लिए एक वैध उपयोग के मामले की तरह लगता है, लेकिन फाइल में बिना सूचना के जाएं
jon_darkstar

@CharlesDuffy क्या दोनों मामलों को संभालने का कोई आसान तरीका है?
jtlz2

1
Fwiw मेरा समाधान सिर्फ एक अतिरिक्त \nचरित्र को pformat में जोड़ना है। कम से कम इस तरह से ब्लॉक एक साथ है।
चावलकेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.