pythonlogging.FileHandler默认使用块缓冲吗?

sou*_*edi 8 python logging output-buffering

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

而且看代码logging.FileHandler调用时并没有传递具体的缓冲模式open()。因此,当您写入日志文件时,将使用默认块大小对其进行缓冲。

那是对的吗?


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


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

sou*_*edi 8

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

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

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

StreamHandler 中的刷新调用意味着,如果您的程序作为systemd服务运行并且您登录到stderr. 在这种情况下,Python 3 需要刷新。当 stderr 不是 TTY 时,Python 3 目前使用块缓冲。请参阅有关 Python 问题 13597 的讨论

我的错误的可能原因

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

我认为我假设太多,并且我没有考虑到这里如何使用继承(argh)。例如,基本 Handler 类有一个空的 flash() 方法,但 StreamHandler 不想继承它,因为它有一个奇怪的文档字符串“此版本不执行任何操作,旨在由子类实现”。