我有一个多线程rails应用程序,它有许多工作程序,它们从resque队列和日志消息中提取消息。我已经把linux logrotate用于旋转日志,然后上传到S3。
上传和删除文件后,我发现仍然使用了磁盘空间,并且没有释放。当我执行下面的命令时,我看到很多文件。
lsof | grep deleted
ruby 14530 fadmin 7w REG 202,1 1972144092 407325 /home/log/production_database.log.1 (deleted)
ruby-time 14536 20352 fadmin 7w REG 202,1 1972144092 407325 /home/log/production_database.log.1 (deleted)
每次填充磁盘空间。只有在我杀死所有Ruby进程时它才会释放空间。
我可以知道旋转日志的最佳方法是什么,以及我应该如何避免这个问题?
答案 0 :(得分:1)
最后使用logrotate进行选项工作..无需杀死或重新启动ruby进程
/home/log/*.log {
maxsize 1M
missingok
rotate 20
notifempty
nocreate
copytruncate
su root root
}
解决我问题的主要参数是
copytruncate - 复制日志文件,然后将其清空。这可以确保Rails写入的日志文件始终存在,因此您不会遇到问题,因为文件实际上没有更改。如果您不使用它,则每次都需要重新启动Rails应用程序。
答案 1 :(得分:0)
来自此处的解决方案http://www.akitaonrails.com/2013/06/28/if-rotacao-de-logs-em-apps-rails#.UdTZ4T7wKeI使用记录器配置来旋转文件,例如:
config.logger = Logger.new(Rails.root.join("log",Rails.env + ".log"), 5, 100*1024*1024)