Rails 记录器即使在删除日志文件后也不会释放日志文件;它一直在磁盘上占用 space

Rails logger does not release log file even after deleting log file; it keeps taking space on disk

我有一个多线程 rails 应用程序,它有很多工作人员,它们从 resque 队列中提取消息并记录消息。我已经把 linux logrotate 旋转日志,然后上传到 S3。

上传和删除文件后,看到磁盘space还在使用,没有释放。当我执行下面的命令时,我看到很多文件。

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)

每次都填满磁盘space。只有当我杀死所有 Ruby 个进程时,它才会释放 space。

我能知道轮换日志的最佳方法是什么吗?我应该如何避免这个问题?

这里有一个解决方案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)

终于在下面的选项中使用 logrotate .. 而无需终止或重新启动 ruby 进程

/home/log/*.log {
    maxsize 1M
    missingok
    rotate 20
    notifempty
    nocreate
    copytruncate
    su root root
}

解决我问题的主要参数是

copytruncate – 复制日志文件然后清空它。这可以确保 Rails 正在写入的日志文件始终存在,这样您就不会遇到问题,因为文件实际上并没有改变。如果不使用它,则每次都需要重新启动 Rails 应用程序。