यहाँ मैं एक 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(...)
पैच करेगा, इसलिए यदि आप एकाधिक लॉगिंग कक्षाओं का उपयोग कर रहे हैं, तो यह पैच अन्य लॉगिंग कक्षाओं को भी प्रभावित करेगा!
उम्मीद है कि मदद करता है।
तो आप एकाधिक लॉग प्रविष्टियों को जोड़ना चाहते हैं? समस्या यह है कि लॉग प्रविष्टियां कागज के अलग-अलग टुकड़ों की तरह होती हैं। जबकि प्रिंट एक ही शीट पर लिखता रहता है, वास्तव में लॉग हमेशा एक नए नए से शुरू होता है। –
मुझे यहां समाधान मिला है http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top यह मेरे लिए काम करता है। – Maxim13
पायथन> = 3.2 में, कोई ['StreamHandler.terminate = '' '] (https://docs.python.org/3/library/logging.handlers.html#streamhandler) का उपयोग कर सकता है। – Ninjakannon