Rails でのバッチ処理内でログを出力する方法
以前書いた Rails でのバッチ処理(http://d.hatena.ne.jp/akishin999/20090723/1248336501)内で、通常の Rails アプリと同じファイル(development.log、production.log)にログを出力する為に以下のようにしています。
module Foo class Bar # Rails の Logger を使用するための宣言 cattr_accessor :logger self.logger ||= RAILS_DEFAULT_LOGGER def self.execute logger.info("Batch start.") begin # バッチの処理 ・ ・ ・ rescue => e logger.error("unhandled exception occurred. #{e} : #{e.backtrace.inject(result = "") { |result, stack| result += "from:#{stack}\n" }}") ensure logger.info("Batch end.") logger.flush # 明示的に flush を呼ぶ end end end end
ensure で明示的に flush を呼ばないと、 production 環境の場合のみログがファイルに出力されないので注意が必要です。
実は今日これに気付かず 2 時間ほどハマってしまいました。
ハマりからの脱出には後輩君から教えてもらった以下の URL が参考になりました。
ありがとうございました。
参考
Ruby on Rails (2.0.2)のloggerについて教えてください。 下記のようなクラスを書いてRAILS_ROOT/libとかに置いて、script/runnerでバッチ処理として起動しているのですが.. - 人力検索はてな
http://q.hatena.ne.jp/1222408893
production環境だと Metal内のログがログファイルに書かれない !? - yuum3のお仕事日記
http://d.hatena.ne.jp/yuum3/20090504/1241404992