【问题标题】:uWSGI logging not working if log file is removed如果删除日志文件,uWSGI 日志记录将不起作用
【发布时间】:2014-02-26 05:07:45
【问题描述】:

我的目标是轮换 uWSGI 生成的日志,但是当原始日志文件被删除(压缩后)时,它不会再次重新创建。

所以我认为应用程序需要在文件被删除后优雅地重启主进程。我使用这个 RESTART 脚本:

/home/tester/uwsgi-18
--reload /var/run/uwsgi/my_app_tester/my_app_tester.pid

应用重启,但日志没有。

要再次进行日志记录工作,我需要终止 -2 进程并再次运行 START 脚本,因此会生成另一个进程号并且日志记录会再次工作。

显然我不希望仅仅为了旋转日志而如此硬停止......

我的应用是用 Catalyst 构建的,服务器运行 Nginx,这里是 uWSGI START 脚本:

/home/tester/uwsgi-18
--master
--daemonize /var/log/uwsgi/my_app_tester/log
--socket /tmp/uwsgi/my_app_tester/my_app_tester.socket
--processes 1
--psgi /home/tester/my_app/my_app.psgi
--pidfile /var/run/uwsgi/my_app_tester/my_app_tester.pid
--procname-master TESTER
-L

是否有其他方法可以在不丢失连接和日志记录的情况下重新启动应用程序?

提前致谢: 米格

【问题讨论】:

标签: nginx uwsgi catalyst


【解决方案1】:

您有多种方法:

1) 在 logrotate 脚本中复制截断,这将在没有 uWSGI 帮助的情况下可靠地工作

2) uWSGI 日志轮换:--log-maxsize <bytes> 将在达到特定大小时自动轮换日志

3)经典的logrotation + log reloading,只需添加--log-master并使用http://uwsgi-docs.readthedocs.org/en/latest/MasterFIFO.html触发log reloading

还有其他方法(例如在触摸文件时触发日志重新打开),但前一种是最常见的。

【讨论】:

  • 选项 1 和 2 效果很好。不确定 3,但我更喜欢在测试之前阅读它。谢谢!
  • 选择选项 1 是因为 --log-maxsize 感觉不太清晰和方便。
最近更新 更多