正如Matino正确解释的那样:登录多处理设置并不安全,因为多个进程(对其他现有进程一无所知)正在写入同一文件,并且可能相互干扰。
现在发生的是,每个进程都拥有一个打开的文件句柄,并对该文件执行“追加写入”。问题是在什么情况下追加写入是“原子的”(也就是说,不能被其他进程写入同一文件并混合其输出而中断)。这个问题适用于每种编程语言,最后它们将对内核进行syscall。
归结为检查在
/usr/include/linux/limits.h4096字节中定义的Linux上的管道缓冲区大小。对于其他操作系统,您可以在此处找到一个不错的列表。
这意味着:如果您的日志行少于4‘096字节(如果在Linux上),那么如果直接连接磁盘(即在两者之间没有网络),则附加文件是安全的。但有关更多详细信息,请检查我的答案中的第一个链接。要对此进行测试,可以
logger.info('procname %s id %s %s' % (proc.name, proc.pid,str(proc.name)*5000))使用不同的长度。以5000为例,我已经弄混了日志行/tmp/test.log。
在这个问题中,已经有很多解决方案,因此在这里我不会添加自己的解决方案。
更新:烧瓶和多处理
如果由uwsgi或nginx托管,则烧瓶等Web框架将在多个工作程序中运行。在这种情况下,多个进程可能会写入一个日志文件。会有问题吗?
Flask中的错误处理是通过stdout /
stderr完成的,然后由网络服务器(uwsgi,nginx等)处理,该服务器需要注意以正确的方式写入日志(例如,参见[this flask +
nginx示例]))(http://flaviusim.com/blog/Deploying-Flask-with-nginx-uWSGI-and-
Supervisor/),可能还添加了流程信息,以便您可以将错误行与流程相关联。从flasks
doc:
从Flask 0.11开始,默认情况下,错误会自动记录到Web服务器的日志中。但是警告不是。
因此,如果您使用日志
warn消息超出管道缓冲区大小,则仍然会出现日志文件混杂的问题。



