akishin999の日記

調べた事などを書いて行きます。

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