在生产环境多个 THIN 进程下,用日志切分的方式会存在问题
config.logger = Logger.new("#{Rails.root}/log/#{Rails.env}.log", 10, 10.megabytes)
深入到 Logger 类去看了下,这种方式好像有问题,一个进程对日志切分了以后,其他进程写入的日志就会乱了。 比如开了两个 THIN,THIN1 和 THIN2,这两个进程初始化的时候都是对 production.log 写入日志,当 THIN1 写入日志的时候到达设定的大小时,就会先关闭,然后将 production.log 重命名为 production.log.0,然后新建 production.log 文件并重新开启日志,但这时 THIN2 引用的还是原来的日志文件,即重名后的 production.log.0 文件,当 THIN2 处理请求写入日志时,发现日志到达指定大小了,也会和 THIN1 一样,首先将 production.log.0 重命名为 production.log.1,然后将 production.log 重命名为 production.log.0(这时 production.log 并未到达指定大小就被增长了),同时也新建 production.log 文件并重新开启日志,这时 THIN1 引用的是被重命名后的 production.log.0 且未到达指定大小,而 THIN2 引用的是 production.log,两个进程写入的日志就乱了!
这是 Logger 切分日志的主要方法:
def shift_log_age
(@shift_age-3).downto(0) do |i|
if FileTest.exist?("#{@filename}.#{i}")
File.rename("#{@filename}.#{i}", "#{@filename}.#{i+1}")
end
end
@dev.close
File.rename("#{@filename}", "#{@filename}.0")
@dev = create_logfile(@filename)
return true
end
不知道大家有没有发现过这个问题???