Rails でログを出力させるときの注意点

よく Rails

class Hoge < ActiveRecord::Base
  ....

  # logger
  def my_log(text)
    Logger.new(File.join(Rails.root, "/log/my_logger.log", "daily")).info text
  end
end

などとやって,ログを出力させたりする場合がありますが,上記の場合だと毎回ファイルをオープンしてしまうので,そのコストは場合によっては馬鹿にならなくなります.

そこで

class Hoge < ActiveRecord::Base
  ....

  # logger
  def my_log(text)
    @@my_logger ||= Logger.new(File.join(Rails.root, "/log/my_logger.log", "daily"))
    @@my_logger.info text
  end
end

として,クラス変数にキャッシュさせることで,その頻度を下げることができます.

一つ注意点としては @@logger を使わないこと.これは ActiveRecord や ActionMailer デフォルトのロガーになっているので,それを上書きしてしまいます.結構はまりやすい罠なので,ご注意を.