Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python logging.FileHandler是否默认使用块缓冲?_Python_Logging_Output Buffering - Fatal编程技术网

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.7
a
模式基本上可以满足您的系统对
openat
调用的任何要求。py3.x
a
是文本模式,因此您将获得缓冲文本io(默认情况下,在非tty块上,在tty行上),下面的文件句柄
openat
是相同的(除了
|O|u CLOEXEC
,“不可继承”fd),但缓冲来自
io
模块。