新行\n插入到StreamHandler类中。
如果您真的设置了修复这个行为,那么这里有一个例子说明我是如何通过logging.StreamHandler类中的monkey patching方法解决这个问题的。A monkey patch is a way to extend or modify the run-time code of dynamic languages without altering the original source code. This process has also been termed duck punching.
这里是省略换行符的emit()的自定义实现: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进行子类化)。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)
有些人可能会争辩说,这种类型的解决方案并不是“Python”或其他什么。可能是这样,所以要小心。
另外,请注意,这将全局修补SteamHandler.emit(...),因此如果您使用多个日志类,那么此修补程序也将影响其他日志类!
查看以下内容以进一步阅读:
希望能有所帮助。