python - Gunicorn 在 logrotate 后坚持旧日志

标签 python gunicorn logrotate

我正在使用 logrotated 来轮换 gunicorn 访问日志。 这是我的 logrotated 配置

/opt/api/log/access.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        killall -s USR1 gunicorn
    endscript
}

日志被正确轮换、压缩,并创建了一个新的 access.log。 但是,gunicorn 不会释放指向旧日志文件的“指针”,因此轮换实际上不会释放磁盘空间。

我仍然可以使用 lsof 查看它的条目

如果我执行 initctl restart api ,gunicorn 将重新启动并且磁盘空间最终被释放。

如何以比重启服务更干净的方式释放磁盘空间?

最佳答案

通常 Linux 进程接受一个特殊的 signal通知他们日志文件轮换。在这种情况下,您将信号 SIGUSR1 发送到以处理系统上的所有 gunicorn 进程。

问题是

  • 你运行的系统中是否存在这样的进程

  • gunicorn 进程是否接受 SIGUSR1 信号

根据 gunicorn 源代码 USR1 确实应该轮换日志

...所以我怀疑 killall 没有将命令发送到正确的进程。

要找出这一点,请使用 ps 检查您的进程列表。如果您发现 gunicorn 进程,请修改 workers/base.py 以打印日志条目以查看它们是否收到信号。尝试手动发送信号,如果它有效,那么它是 logrotate 配置,但不知何故不起作用。

关于python - Gunicorn 在 logrotate 后坚持旧日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146006/

相关文章:

python - 将命令式算法转换为函数式算法

Python 执行速度 : laptop vs desktop

Python合并数据框和列表字典的字典

windows - 使用 Windows 机器将 Django 部署到 Heroku(生产服务器而非开发服务器)

docker - Gunicorn/Uvicorn worker 在 AWS Fargate 上超时

linux - 在 Linux 上旋转二进制文件

python - 为 "assertEqual"和 "assertNotEqual": should I bother? 编写测试

python - 将 Python/Flask 应用程序从 Heroku 迁移到 Azure 时出现 WSGI 错误

linux - 配置logrotate状态文件