为了阻止我们的日志文件变得太大,填写磁盘,我们正在使用内置于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.
希望这可以帮助..