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

Does python logging.FileHandler use block buffering by default?

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

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

对吗?


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


我对 Python 版本 2.7 和 3.7 感兴趣。

不是真的。它会刷新每条单独的消息,这就是您想要的。

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

如果您查看 logging.MemoryHandler,flush() 方法开始变得更有意义。对于想要添加缓冲的程序,MemoryHandler 允许包装另一个处理程序,并缓冲一定数量的消息。它还将立即刷新高于设定严重级别的消息。 logging 不包含每秒左右自动刷新一次的处理程序,但您始终可以自己编写一个。

如果您的程序 运行 作为 systemd 服务并且您登录到stderr。 Python 3 在这种情况下需要刷新。 Python 3 当前在不是 TTY 时为 stderr 使用块缓冲。参见 discussion on Python issue 13597

我错误的可能原因

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

我想我假设太多了,我没有考虑到这里使用继承 (argh) 的方式。例如。基础 Handler class 有一个空的 flush() 方法,但 StreamHandler 不想继承它,因为它有一个奇怪的文档字符串 "This version does nothing and is intended to be implemented by subclasses".