ruby-on-rails – Rails日志转换是保持旧日志打开并填满

我帮助维护一个Rails网站.它在Solaris Sparc机器上运行J Ruby 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日志我看到这样的东西:

-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,通常我们每天做100MB.这是因为它充满了重复的请求.我不能轻易地将其粘贴到这里,但日志在10月3日18:50(我认为是日志旋转的那一点)上已经填满了相同的1000行请求,一遍又一遍地打印出来.从过去的经验来看,日志文件将继续填充这些重复的内容,直到磁盘填满.

日志转换/ Rails日志记录是否简单? (我们的日志文件用法没有什么奇怪的事情:我们不做任何直接的日志记录,这一切都来自于Rails框架.)明显的下一步是尝试像logrotate一样,但是如果Rails拒绝关闭旧的日志文件,正在向他们写垃圾,我怀疑它不会解决我的问题(因为日志永远不会关闭,因此磁盘空间从未恢复).

解决方法

这个症状似乎是一个旧的日志文件仍然被使用,尽管你成功地旋转了日志.

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

解决方案是确保所有的Rails实例在日志被旋转后重新启动,所以他们都使用新的文件句柄/名称.

使用logrotate而不是config.logger来旋转你的日志!

我建议使用UNIX logrotate旋转日志,而不是config.logger.
IMHO是一个更好的解决方案,更可靠,您可以更好地控制日志轮换,您可以提供一些后转命令来重新启动Rails进程. (通过logrotate的postrotate或endscript选项)

看到:

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选项重新启动您的Mongrels.

希望这可以帮助..

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...