我想在执行例如log.info("msg")时取消换行。当我们使用"print"时它只是...
我想让当我执行log.info("msg")时,不要打印出额外的换行符。然而,当我们使用"print"时,它会自动添加一个换行符。
print msg,
所以我需要像日志记录一样的逗号。
我看到了这个问题“在Python日志模块中抑制换行符”,但有人能否给我一个参考或像“Hello world”一样简单的例子呢?谢谢!
我想让当我执行log.info("msg")时,不要打印出额外的换行符。然而,当我们使用"print"时,它会自动添加一个换行符。
print msg,
所以我需要像日志记录一样的逗号。
我看到了这个问题“在Python日志模块中抑制换行符”,但有人能否给我一个参考或像“Hello world”一样简单的例子呢?谢谢!
以下是我为一个类似问题所做的回答(原链接):
新行符\n
被插入到StreamHandler
类的emit(...)
方法内。
如果你真的想要修复这个问题,那么下面是我通过monkey patching方式来解决这个问题的示例,即在logging.StreamHandler类中修改emit(self, record)
方法。
Monkey patch是一种不改变原始源代码,扩展或修改动态语言运行时代码的方法。这个过程也被称为“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)
有些人可能会认为这种解决方案不够“Pythonic”,或者其他什么的。也许是这样,所以要小心。
此外,请注意,这将全局修补SteamHandler.emit(...)
,因此如果您正在使用多个日志记录类,则此修补程序也会影响其他日志记录类!
希望这可以帮到你。
这是不可能的(除非严重破坏日志模块)。如果您必须具有此功能,请逐步构建日志字符串,仅当您准备显示带有换行符的日志消息时再进行日志记录。
StreamHandler.terminate = ''
。 - Ninjakannon