使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换

Posted

技术标签:

【中文标题】使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换【英文标题】:Atomic log file rotation with Flask and RotatingFileHandler 【发布时间】:2015-03-17 06:15:46 【问题描述】:

我在我的 Flask 应用程序中使用标准 RotatingFileHandler 和下一个参数:maxBytes=10 * 1024 * 1024, backupCount=50。应用由 nginx 后面的 uWSGI 管理。 uWSGI 配置文件部分如下所示:

processes = 16
enable-threads = true
threads = 10

在应用程序启动后,一切(我的意思是日志记录)都运行良好。但是在第一次日志文件轮换之后,一些进程(也可能是线程)继续写入旋转的文件和一些 - 到新的。这很明显。但对我来说,如何以我的所有进程(和线程)开始将消息写入新文件的方式轮换日志文件并不是很明显。

【问题讨论】:

您可以旋转文件,但最好使用一个专用进程来侦听套接字并像现在一样使用RotatingFileHandler 写入文件。 IMO 这不是一个大的变化,实际上调用日志记录的代码都不会受到影响 - 只是进行日志记录配置的代码。 是的,这很容易做到。 张贴this link 供未来的读者解释为什么这种行为发生在 Flask / pre-forked 应用程序中。这不是一个解决方案,但肯定有助于理解。 【参考方案1】:

请注意,不支持从多个进程写入单个日志文件,因为没有可以使用的跨平台同步机制。请参阅 this cookbook entry 了解可能对您有用的建议方法。

【讨论】:

所以,如果我理解正确,我的日志记录解决方案是错误的(因为我有多个进程),我不应该尝试原子地旋转文件,而是更改整个日志记录模型? @VinaySajip - 请问您对此有何意见?鉴于this page 和this SO answer 的解释,您是否同意使用syslog 是记录小型/本地托管/少数用户Flask 服务的合理解决方案?谢谢。 @S3DEV 是的,这是合理的,但这不是您可以采取的唯一方法。如果“小型/本地托管”意味着部署中的单个进程,那么没有理由使用RotatingFileHandler。关于 Flask 日志记录的文章是指从多个进程进行日志记录的场景。 @VinaySajip - 太好了,感谢您的回复。部署有四个工作人员在运行,所以我在这里遇到了问题。再次感谢!

以上是关于使用 Flask 和 RotatingFileHandler 进行原子日志文件轮换的主要内容,如果未能解决你的问题,请参考以下文章

flask 的 g 和session 的区别怎样理解

Flask (flask-restful) 和 MySQLdb (PyMySQL) 的奇怪并发问题

Python之Flask框架使用

Flask之flask-script模块使用

使用 flask_socketio + flask + gunicorn + nginx 获得 502 bad gateway 和 400 bad request

如何使用 flask_pymongo 和 flask_admin 添加管理员