production環境だと Metal内のログがログファイルに書かれない !?

Metalで書かれたコード内でログを出すには RAILS_DEFAULT_LOGGER.info("....") を使いますが、development環境では出ていたログが、 production環境だとログファイルに書かれません !?

http://www.rubyonrails.org/images/rails.png

調べてみると、Ruby on Railsのログは ActiveSupport::BufferedLogger というロガーを使っています。このロガーはパフォーマンスを考慮し、flush()メソッドが呼ばれるまで1000byteのログはメモリー上におかれようになっています。

production環境以外では、auto_flushing がtrue になっていて info(), debug() 等のメソッドが呼び出されると直ぐにファイルに書かれますが、production環境ではこのバッファーが有効になっているので直ぐにはログファイルには書かれません。

ただし、production環境でも通常のRailsのコントローラが動いた場合は、dispatchの中でflush()されています。しかし Metalではこのようなflush()呼び出しは行われないので、 すぐにログファイルに書きたい場合はflush() は自分で呼び出す必要があります。