2012-10-02 9 views
9

जब मैं log.info ("msg") उदाहरण के लिए करता हूं तो मैं नई लाइन को रद्द करना चाहता हूं। यह सिर्फमैं पायथन लॉगिंग मॉड्यूल में नई लाइन को कैसे दबा सकता हूं।

print msg, 

तो मैं प्रवेश के लिए कोमा तरह कुछ की जरूरत है जब हम "प्रिंट" से करते हैं।

मैं इस सवाल का बोना Suppress newline in Python logging module लेकिन किसी को भी मेरे संदर्भ या की तरह "हैलो दुनिया" धन्यवाद एक सरल उदाहरण दे सकते हैं!

+1

तो आप एकाधिक लॉग प्रविष्टियों को जोड़ना चाहते हैं? समस्या यह है कि लॉग प्रविष्टियां कागज के अलग-अलग टुकड़ों की तरह होती हैं। जबकि प्रिंट एक ही शीट पर लिखता रहता है, वास्तव में लॉग हमेशा एक नए नए से शुरू होता है। –

+2

मुझे यहां समाधान मिला है http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top यह मेरे लिए काम करता है। – Maxim13

+0

पायथन> = 3.2 में, कोई ['StreamHandler.terminate = '' '] (https://docs.python.org/3/library/logging.handlers.html#streamhandler) का उपयोग कर सकता है। – Ninjakannon

उत्तर

5

यह संभव नहीं है (लॉगिंग मॉड्यूल में कुछ गंभीर हैकिंग के बिना)। यदि आपके पास यह कार्यक्षमता होनी चाहिए, तो भागों में लॉगिंग स्ट्रिंग का निर्माण करें और जब आप न्यूलाइन के साथ लॉग संदेश प्रदर्शित करने के लिए तैयार हों तो इसे लॉग ऑन करें।

5

यहाँ मैं एक similar question के लिए जवाब है:

नई लाइन, \n, StreamHandler वर्ग के emit(...) विधि अंदर डाला जाता है।

तुम सच में इस व्यवहार फिक्सिंग पर सेट कर रहे हैं, तो यहाँ कैसे मैं logging.StreamHandler वर्ग के अंदर emit(self, record) विधि monkey patching द्वारा इस हल का एक उदाहरण है।

एक बंदर पैच मूल स्रोत कोड को बदलने के बिना गतिशील भाषाओं के रन-टाइम कोड को बढ़ाने या संशोधित करने का एक तरीका है। इस प्रक्रिया को बतख पंचिंग भी कहा जाता है।

def customEmit(self, record): 
    # Monkey patch Emit function to avoid new lines between records 
    try: 
     msg = self.format(record) 
     if not hasattr(types, "UnicodeType"): #if no unicode support... 
      self.stream.write(msg) 
     else: 
      try: 
       if getattr(self.stream, 'encoding', None) is not None: 
        self.stream.write(msg.encode(self.stream.encoding)) 
       else: 
        self.stream.write(msg) 
      except UnicodeError: 
       self.stream.write(msg.encode("UTF-8")) 
     self.flush() 
    except (KeyboardInterrupt, SystemExit): 
     raise 
    except: 
     self.handleError(record) 

तो फिर तुम (इस मामले में, TimedRotatingFileHandler से उपवर्गीकरण) एक कस्टम प्रवेश वर्ग बनाना होगा:

यहाँ कि पंक्ति विराम को अस्वीकार करते हैं emit() का रिवाज कार्यान्वयन है।

class SniffLogHandler(TimedRotatingFileHandler): 
    def __init__(self, filename, when, interval, backupCount=0, 
       encoding=None, delay=0, utc=0): 

     # Monkey patch 'emit' method 
     setattr(StreamHandler, StreamHandler.emit.__name__, customEmit) 

     TimedRotatingFileHandler.__init__(self, filename, when, interval, 
              backupCount, encoding, delay, utc) 

कुछ लोगों का तर्क हो सकता है कि समाधान के इस प्रकार pythonic, या जो कुछ भी नहीं है। ऐसा हो सकता है, इसलिए सावधान रहें।

इसके अलावा, यह जान लें कि यह वैश्विक स्तर पर SteamHandler.emit(...) पैच करेगा, इसलिए यदि आप एकाधिक लॉगिंग कक्षाओं का उपयोग कर रहे हैं, तो यह पैच अन्य लॉगिंग कक्षाओं को भी प्रभावित करेगा!

उम्मीद है कि मदद करता है।

संबंधित मुद्दे

 संबंधित मुद्दे