baronyan's blog

linux,macでruby、railsでの開発をしていく中で知ったこと、備忘的なことなどを書いていきます。

rails3.0.3でログにタイムスタンプを表示する方法

今私が運用中のアプリの中に、rails3.0.3ベースのものが2つあります。

railsのデフォルトのロガーはなんと日時を表示してくれず、

障害発生時に困ることがしばしばでした。

 

そこで、ログに日時が表示されるようにカスタマイズしてみました。

 

rails標準のログ出力と、p出力の両方に対して、日時が表示されるようにしました。

 

1.p

荒っぽいですが、config/boot.rbに手を入れました。次のコードを追記します。

module Kernel
  alias original_p p
  def p(str)
    original_p("[#{Time.now.to_s(:db)}] #{str}")
  end
end

 

 

2.railsログ

config/initializersにlog_with_time.rbを追加しました。

module ActiveSupport
  class BufferedLogger
    def add(severity, message = nil, progname = nil, &block)
      return if @level > severity
      message = (message || (block && block.call) || progname).to_s
      # If a newline is necessary then create a new message ending with a newline.
      # Ensures that the original message is not mutated.
      message = "[#{Time.now.to_s(:db)}] #{message}\n" unless message[-1] == ?\n
      buffer << message
      auto_flush
      message
    end
  end
end

 

rubyはオープンクラスで既存のクラスを編集できるので非常に便利ですね。