我帮助维护一个Rails网站。它在Solaris Sparc机器上运行JRruby 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 拒绝关闭旧日志文件并永远写入垃圾数据,则我怀疑它不会解决我的问题(因为日志永远不会关闭,因此磁盘空间永远无法恢复)。