python logging.FileHandler默认使用块缓冲吗?

问题描述 投票:2回答:1

logging处理程序类有一个flush()方法。

并且看着codelogging.FileHandler在调用open()时没有通过特定的缓冲模式。因此,当您写入日志文件时,它将使用默认块大小进行缓冲。

那是对的吗?


这让我感到惊讶,因为当我管理自己的系统时,我习惯于将日志文件视为系统上的实时(或near-live)视图。对于这种用例,需要行缓冲。此外,传统的syslog()到日志记录守护程序不会缓冲消息。


我对最新版本的Python感兴趣:2.7和3.7。

(也许是最近的历史。任何与拟议补丁相关的答案都将是一个强有力的竞争者:-)。有些意见可能与此有关,因为我不是很有经验)。

python logging output-buffering
1个回答
0
投票

并不是的。它将刷新每条消息,这就是您想要的。

FileHandler继承自StreamHandler。 StreamHandler在每次write()之后调用self.flush()。

如果你看一下logging.MemoryHandler,flush()方法会更有意义。对于想要添加缓冲的程序,MemoryHandler允许包装另一个处理程序,并缓冲一定数量的消息。它还将立即刷新超过设置的严重性级别的消息。 logging不包括每隔一秒左右自动刷新的处理程序,但你总是可以自己写一个。

如果您的程序作为systemd服务运行并且您登录到stderr,则StreamHandler中的刷新调用也意味着它可以执行您想要的操作。在这种情况下,Python 3需要刷新。当Python 3不是TTY时,Python 3当前对stderr使用块缓冲。见discussion on Python issue 13597

我错误的可能原因

我想我对StreamHandler代码感到困惑。如果用户永远不需要调用flush()方法,为什么StreamHandler会定义一个非空的,公开记录的实现?

我想我假设太多了,我不允许在这里使用继承(argh)。例如。基本的Handler类有一个空的flush()方法,但是StreamHandler不想继承它,因为它有一个奇怪的文档字符串“这个版本什么都不做,并且打算由子类实现”。

© www.soinside.com 2019 - 2024. All rights reserved.