python logging.FileHandler是否默认使用块缓冲?
python logging.FileHandler是否默认使用块缓冲?,python,logging,output-buffering,Python,Logging,Output Buffering,日志记录处理程序类有一个flush()方法 查看,logging.FileHandler在调用open()时没有通过特定的缓冲模式。因此,当您写入日志文件时,它将使用默认块大小进行缓冲 对吗 这让我感到惊讶,因为当我管理自己的系统时,我习惯于将日志文件视为系统上的实时(或)视图。对于这个用例,需要行缓冲。此外,日志守护进程的传统syslog()不会缓冲消息 我对Python的最新版本感兴趣:2.7和3.7 (也许还有最近的历史。任何与拟议补丁相关的答案都将是强有力的竞争者:-)。有些观点可能
日志记录
处理程序类有一个flush()方法
查看,logging.FileHandler
在调用open()
时没有通过特定的缓冲模式。因此,当您写入日志文件时,它将使用默认块大小进行缓冲
对吗
这让我感到惊讶,因为当我管理自己的系统时,我习惯于将日志文件视为系统上的实时(或)视图。对于这个用例,需要行缓冲。此外,日志守护进程的传统syslog()不会缓冲消息
我对Python的最新版本感兴趣:2.7和3.7
(也许还有最近的历史。任何与拟议补丁相关的答案都将是强有力的竞争者:-)。有些观点可能与此相关,因为我不是很有经验。它将刷新每个单独的消息,这是您想要的 FileHandler继承自StreamHandler。StreamHandler在每次写入流()后调用self.flush() 如果查看
logging.MemoryHandler
,flush()方法开始变得更有意义。对于要添加缓冲的程序,MemoryHandler允许包装另一个处理程序,并缓冲一组消息。它还将在超过设置的严重性级别的消息上立即刷新<代码>日志记录不包括每秒自动刷新的处理程序,但您始终可以自己编写一个
StreamHandler中的flush调用还意味着,如果您的程序作为systemd
服务运行,并且您登录到stderr
,它会执行您想要的操作。在这种情况下,Python 3需要刷新。Python3当前在stderr不是TTY时使用块缓冲。看
我犯错误的可能原因
我想我被StreamHandler代码弄糊涂了。如果用户从来不需要调用flush()方法,为什么StreamHandler会定义一个非空的、公开文档的实现
我想我假设的太多了,我没有考虑如何在这里使用继承(argh)。例如,基本处理程序类有一个空的flush()方法,但是StreamHandler不想继承它,因为它有一个奇怪的docstring“这个版本什么都不做,打算由子类实现”。关于
stderr
的小说明当tty时,它倾向于默认为无缓冲,与标准输出不同,标准输出通常默认为行缓冲。不知道systemd/journald
,但我认为将任何标准捕获/重定向的缓冲更改为相同(无缓冲)是有意义的。我的问题的答案是“不”-我读错了代码,我会写出来的。关于stderr的缓冲,我认为python3有令人惊讶的行为。我刚从文件上说它可以被块缓冲,我认为文件是准确的。更多讨论。是的,我查阅了底层代码。。。py2.7a
模式基本上可以满足您的系统对openat
调用的任何要求。py3.xa
是文本模式,因此您将获得缓冲文本io(默认情况下,在非tty块上,在tty行上),下面的文件句柄openat
是相同的(除了|O|u CLOEXEC
,“不可继承”fd),但缓冲来自io
模块。