【发布时间】: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