新行 \n 被插入到 StreamHandler 类中。
如果您真的打算修复这种行为,那么下面是我如何通过 monkey patching emit(self, record) logging.StreamHandler 类中的方法解决此问题的示例。
猴子补丁是一种在不改变原始源代码的情况下扩展或修改动态语言的运行时代码的方法。这个过程也被称为打鸭子。
这是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)
有些人可能会争辩说这种类型的解决方案不是 Pythonic 或其他。可能是这样,所以要小心。
另外,请注意,这将全局修补 SteamHandler.emit(...),因此如果您使用多个日志记录类,那么此补丁也会影响其他日志记录类!
查看这些以进一步阅读:
希望对您有所帮助。