Rails记录器即使在删除日志文件后也不会释放日志文件;它不断占用磁盘空间

时间:2018-05-17 07:40:30

标签: ruby-on-rails ruby-on-rails-3 logrotate

我有一个多线程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进程时它才会释放空间。

我可以知道旋转日志的最佳方法是什么,以及我应该如何避免这个问题?

2 个答案:

答案 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)