Rails日志转换是保持旧日志打开并填满它

Nei*_*own 13 logging ruby-on-rails jrubyonrails

我帮助维护一个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)
Run Code Online (Sandbox Code Playgroud)

哪个应该在日志文件达到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
Run Code Online (Sandbox Code Playgroud)

注意最近循环的日志如何仍然打开并仍然被写入(运行pfiles确认Rails服务器仍然有三个文件句柄到日志).另请注意,它在两天内达到了3千兆字节,通常我们每天可以达到100千兆字节.这是因为它充满了重复的请求.我不能轻易地将它粘贴在这里,但是日志充满了10月3日18:50(相信是日志旋转点)的相同1000行请求,一遍又一遍地打印.根据过去的经验,日志文件将继续填充此重复内容,直到磁盘填满.

日志转移/ Rails日志记录是否明显破坏?(我们的日志文件用法并不奇怪:我们不做任何直接日志记录,它只是来自Rails框架.)明显的下一步是尝试像logrotate,但如果Rails拒绝关闭旧的日志文件和我永远在给他们写垃圾,我怀疑它不会解决我的问题(因为日志永远不会被关闭,因此磁盘空间永远不会恢复).

Til*_*ilo 10

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

原因很可能是您的一个或多个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跟踪并重新启动它的工作人员!您可以在日志轮换后终止工作程序,Unicorn将重新启动它们,确保它们使用新的日志文件.

请参阅:https://github.com/blog/517-unicorn (Unicorn对Mongrel的许多优势)

如果您使用的是Mongrel并且无法切换到Unicorn:

使用logrotate,并通过该postrotate选项重新启动Mongrels .

希望这可以帮助..