在Python日志记录模块中禁止换行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python日志记录模块中禁止换行相关的知识,希望对你有一定的参考价值。
我正在尝试用Python的日志记录模块替换ad-hoc日志记录系统。我正在使用日志记录系统在一行中输出长任务的进度信息,这样您就可以在日志中查看日志或在控制台中查看日志。我通过在我的日志记录功能上设置一个标志来完成此操作,该标志会抑制该日志消息的换行符并逐个构建该行。
所有日志记录都是从一个线程完成的,因此没有序列化问题。
是否可以使用Python的日志模块执行此操作?这是个好主意吗?
让我们从你的最后一个问题开始:不,我不相信这是个好主意。 IMO,从长远来看,它会损害日志文件的可读性。
我建议坚持使用tail
模块并使用'tail'命令中的'-f'选项来监视控制台的输出。您可能最终会使用logging。请注意,'delay'的默认参数为False,这意味着输出不会被缓冲。
如果你真的需要压制换行符,我建议你创建自己的Handler。
如果要执行此操作,可以更改日志记录处理程序终止符。我正在使用Python 3.4。这是在Ninjakannon所说的Python 3.2中引入的。
FileHandler
当StreamHandler写入时,它最后写入终结符。
新的线路handler = logging.StreamHandler()
handler.terminator = ""
插入了
级别。
如果你真的开始修复这个行为,那么这里是一个例子,说明我是如何通过qazxswpoi在logging.StreamHandler类中的StreamHandler
方法解决这个问题的。
猴子补丁是一种扩展或修改动态语言的运行时代码而不改变原始源代码的方法。这个过程也被称为鸭子冲孔。
以下是省略换行符的monkey patching的自定义实现:
emit(self, record)
然后你将创建一个自定义日志记录类(在这种情况下,从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)
有些人可能会说这种解决方案不是Pythonic,或者其他什么。可能是这样,所以要小心。
另外,请注意这将全局修补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)
SteamHandler.emit(...)
- What is monkey-patching?
希望有所帮助。
以上是关于在Python日志记录模块中禁止换行的主要内容,如果未能解决你的问题,请参考以下文章