【问题标题】:Rails log shifting is keeping old log open and filling it upRails 原木移位使旧原木保持打开状态并填满
【发布时间】:2011-11-30 17:57:33
【问题描述】:

我帮助维护一个 Rails 网站。它在 Solaris Sparc 机器上运行 JRuby 1.5.5、Rails 2.3.10。我有一个与日志记录相关的问题。

为了阻止我们的日志文件变得过大并填满磁盘,我们使用了 Logger 类中内置的日志转移。在 config/environments/production.rb 我们有:

config.logger = Logger.new(config.log_path, 10, 100.megabyte)

当日志文件达到 100 兆字节时应该轮换日志文件,并且只保留 10 个文件。

问题有两个方面:Rails 没有正确轮换日志,并且它保持打开旧日志文件以对其进行写入——但它正在写入的只是一些请求的重复内容。所以如果我做ls -l log 我会看到这样的东西:

-rw-r--r-- 83040892 Oct  4 15:07 production.log
-rw-r--r-- 3303158664 Oct  4 15:07 production.log.0
-rw-r--r-- 104857616 Oct  2 23:13 production.log.1
-rw-r--r-- 104857618 Oct  1 17:12 production.log.2

注意最近循环的日志仍然打开并且仍然被写入(运行pfiles 确认 Rails 服务器仍然具有日志的三个文件句柄)。另请注意,它在两天内达到了 3 GB,而我们通常每天处理 100 MB。这是因为它充满了重复的请求。我不能轻易地将它粘贴到这里,但日志中充满了从 10 月 3 日 18:50 开始的相同的 1000 行请求块(我相信这是日志旋转的点),一遍又一遍地打印。根据过去的经验,日志文件会不断填充这些重复的内容,直到磁盘填满为止。

日志移位/Rails 日志记录是否完​​全损坏? (我们的日志文件使用没有什么奇怪的:我们不做任何直接的日志记录,这一切都来自 Rails 框架。)下一步显然是尝试 logrotate 之类的东西,但是如果 Rails 拒绝关闭旧的日志文件并且永远向他们写垃圾,我怀疑它不会解决我的问题(因为日志永远不会关闭,因此磁盘空间永远不会恢复)。

【问题讨论】:

  • 那里有哪个应用服务器?
  • 日志文件属于哪个用户/组?
  • 如何部署您的应用程序?例如卡皮斯特拉诺?你在前端使用什么,例如阿帕奇? Nginx?独角兽?
  • 这是使用 Mongrel(在 Apache 代理之后,但这不重要),日志文件属于运行服务器的用户,我们不使用 capistrano(我们只是手动部署) .
  • 2.3 已经过时了......您可能需要考虑升级到非常稳定的 3.0,并使用 Unicorn 代替 Mongrel(强烈推荐)。

标签: ruby-on-rails logging jrubyonrails


【解决方案1】:

我想你忘记了以兆字节为单位的“s” 或者改用这样的东西

config.logger = Logger.new(config.log_path, 10, 102400)

也检查这个链接它非常有帮助

http://railsillustrated.com/logger-tricks.html

【讨论】:

  • 不,100.megabyte100.megabytes 的别名(反之亦然)。 100.megabyte #=> 104857600
【解决方案2】:

在处理 Rails 日志文件时,我一直使用平台的日志轮换机制。遵循http://www.nullislove.com/2007/09/10/rotating-rails-log-files/ 的建议,因为我也从http://overstimulate.com/articles/logrotate-rails-passenger 运行Passenger。

第一种方法使用 logrotate copytruncate 方法创建新的日志文件,因此仍有句柄的进程将始终写入当前日志文件。

在服务器上检查的其他事项是:

  • 确保所有 gem 或插件都没有在 ruby​​ 上下文中指向 Logger 的句柄。
  • 由于您使用的是 JRuby,因此请确保某处没有卡住/失控的线程试图满足请求但卡住了日志记录。
  • 与Passenger 一样,考虑不时重启Rails 服务器进程。我知道这实际上是一种 hack,但它可能会奏效。

【讨论】:

  • 我认为您的第二个项目符号可能是重复记录的原因(尽管我们确实在日志中重复了整个请求:正如我所说,1000 行)。但我不确定我将如何追踪这一点:在 Ruby on Rails 中线程并不容易显现,而且我不确定如何调试 JRuby 程序(尤其是在生产服务器上——我'从来没有能够在本地触发问题)。
【解决方案3】:

尼尔,

我不知道这是否适用于您的特定情况,但我遇到了类似的问题,我想我刚刚解决了。就我而言,我有两个症状。第一个问题和你一样——我的日志轮换很糟糕......特别是,production.log.1 文件保持打开状态,并且在 production.log 也被记录到时,正在继续记录到。第二个症状是日志文件所有权和组成员身份将不断更改为 root。我的 Rails 应用程序是通过 Capistrano 部署的,使用“部署者”用户,所以每当应用程序尝试写入不再由部署者拥有的日志文件时,我都会收到各种巧妙的错误。

我很尴尬地说我花了多长时间才意识到这两个问题的原因是什么。在此过程中,我使用应用程序的 crontab 作为 root 更新了 cron。这一定是我在命令提示符下乱搞的时候……如果我只是通过 Capistrano 保留我的部署配方,我就不会无意中这样做了。无论如何,我最终查看了 /var/spool/cron/crontabs 并找到了我的 crontab 文件的两个副本……一个用于部署程序,一个用于 root。因此,cron 为我的应用程序启动的进程被重复了——一个在部署程序下运行,第二个在 root 下运行。是第二个把事情搞砸了。一旦我删除了 root 的 crontab,一切都变得更好了。

一些警告:在我的设置中,root 的 crontab 中没有与应用程序无关的任务,即它与部署者的 crontab 完全相同……所以删除它对我没有副作用。另外,我的服务器运行的是 Ubuntu...您的 crontab 的路径可能不同。

希望对您有所帮助。

  • 大卫

【讨论】:

  • 这正是可能出现问题的那种事情......但不幸的是,我检查并没有这个特殊问题。但是这个建议很受欢迎!
【解决方案4】:

症状似乎是一个旧的日志文件仍在使用,尽管您已成功轮换日志。

原因很可能是您的一个或多个 Rails 实例或线程仍在使用旧文件句柄

解决方案是确保所有 Rails 实例在日志轮换后完全重启,所以它们都使用新的文件句柄/名称。

使用 logrotate 而不是 config.logger 来轮换您的日志!

我建议使用 UNIX logrotate 来轮换您的日志,而不是 config.logger。 恕我直言,这是一个更好的解决方案,更可靠,您可以更好地控制日志轮换,并且您可以提供一些轮换后命令来重新启动 Rails 进程。 (通过 logrotate 的 postrotateendscript 选项)

见:

http://www.opencsw.org/packages/logrotate/(用于 Solaris 的 logrotate 软件包)

http://www.thegeekstuff.com/2010/07/logrotate-examples/(logrotate 示例教程)

http://linux.die.net/man/8/logrotate

你会使用独角兽吗? - Unicorn 内置支持通过 USR1 信号重新打开应用程序中的所有日志文件 - 这允许 logrotate 以原子方式旋转文件... - 独角兽跟踪并重新启动它的工人!您可以在日志轮换后杀死工作人员,Unicorn 将重新启动他们,确保他们使用新的日志文件。

请参阅:https://github.com/blog/517-unicorn(Unicorn 比 Mongrel 有很多优势)

如果您正在使用 Mongrel 并且无法切换到 Unicorn:

使用 logrotate,并通过 postrotate 选项重新启动您的 Mongrel。

希望这会有所帮助..

【讨论】:

  • 我认为您的 logrotate 建议将有助于阻止我们的磁盘空间被填满,我认为这可能是我们必须要做的。我认为我们的日志之后会变得相当无用,因为日志将充满那些重复的请求,但最好有无用的日志而不是用完磁盘空间(这会导致停机)。
  • 您看到重复的“1000 行请求块”,听起来像是 Rails 正在刷新仍在打开的文件句柄上的缓冲区,可能是为了确保没有信息丢失 - 例如将其写入两个文件以确保 - 使用 logrotate 时不应看到此行为
猜你喜欢
  • 2021-05-15
  • 2014-07-31
  • 1970-01-01
  • 2016-01-26
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2023-01-23
相关资源
最近更新 更多