logging
处理程序类具有flush()方法。
看着code,logging.FileHandler
在调用open()
时没有通过特定的缓冲模式。因此,当您写入日志文件时,将使用默认的块大小对其进行缓冲。
对吗?
这让我感到惊讶,因为当我管理自己的系统时,我习惯于将日志文件作为系统上的实时(或near-live)视图进行观看。对于此用例,需要行缓冲。另外,传统的loglog守护程序的syslog()不会缓冲消息。
我对Python的最新版本(2.7和3.7)感兴趣。
(也许是最近的历史。任何链接到所建议补丁的答案都是有力的竞争者:-)。这里有些观点可能是有意义的,因为我经验不足。
答案 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不想继承它,因为它有一个奇怪的文档字符串“此版本不执行任何操作,并且打算由子类实现。”