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

时间:2019-04-10 19:09:02

标签: python logging output-buffering

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

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

对吗?


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


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

(也许是最近的历史。任何链接到所建议补丁的答案都是有力的竞争者:-)。这里有些观点可能是有意义的,因为我经验不足。

1 个答案:

答案 0 :(得分:0)

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

FileHandler继承自StreamHandler。在每次对流执行write()之后,StreamHandler都会调用self.flush()。

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

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

我的错误的可能原因

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

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