我在生产环境中用 nginx+unicorn 测试我的 Rails 站点,发现一个问题。
那就是我在访问时,遇到 500 问题,production.log 不会马上记录的,要等到我频繁了试了很多次 500 以后,production.log 才记录起来。相当于 buffer 满了,再写入文件。
不知道是不是我猜测的这样的行为?
如果默认是这样,那有没有办法可以改变这个行为的?
毫无疑问 Rails 引入 bufferlog 是为了性能,我直觉既然引入了这个 feature,那么 rails core-team 定会提供一个可以 disabled buffer log 的方法,刚刚找了一下,这里提供一个方法你试试看 http://stackoverflow.com/questions/5947551/how-to-write-flush-the-rails-log-when-the-process-dies
config.logger.auto_flushing = false
bufferlog 在 rails2.3 就有的。
~/mine/rails -> (no branch) $ git co v2.3.4
HEAD is now at a43ef24... Prepare for 2.3.4 release
~/mine/rails -> (no branch) $ git grep auto_flushing
actionpack/test/template/benchmark_helper_test.rb: logger.auto_flushing = false
activesupport/CHANGELOG:* BufferedLogger#auto_flushing = N flushes the log every N messages. Buffers with an array instead of string. Disa
ActiveSupport::BufferedLogger#auto_flushing is deprecated. Either set the sync level on the underlying file handle like this:
f = File.open('foo.log', 'w')
f.sync = true
ActiveSupport::BufferedLogger.new f
Or tune your filesystem. The FS cache is now what controls flushing. ActiveSupport::BufferedLogger#flush is deprecated. Set sync on your filehandle, or tune your filesystem.
上面是 3.2 的 changlog 大概的意思是,auto flushing 方法已经取消了。 现在想调节写 log 的 buffer 可以有两种方案: 1.设置文件打开方式:sync or async 2.调节操作系统的的 cache 来控制 fushing。。。这个我也不知道怎么调。。。:-)