loggerで出すログのフォーマットを変えたい。

ということで設定するパラメータを探してみたのだけれど、見つからなかった。具体的には日付とログレベルをメッセージの前に出したかった。
initializerで「configuration.logger」に設定すればloggerを入れ替えられるようだけど、なんというか、ちょっとフォーマットを変えたいだけなのでオブジェクトを入れ替えるほどのことでもないよな、と思っていた。そう、いた。

デフォルトのloggerの中身は「ActiveSupport::BufferedLogger」だったのでログを書き出してるところを探してみたら、

activesupport-2.1.0/lib/active_support/buffered_logger.rb

63 def add(severity, message = nil, progname = nil, &block) 64 return if @level > severity 65 message = (message || (block && block.call) || progname).to_s 66 # If a newline is necessary then create a new message ending with a newline. 67 # Ensures that the original message is not mutated. 68 message = "#{message}\n" unless message[-1] == ?\n 69 buffer << message 70 auto_flush 71 message 72 end

こんな感じだったので、

RAILS_ROOT/config/initializers/buffered_logger_ex.rb

1 module ActiveSupport 2 class BufferedLogger 3 def add(severity, message = nil, progname = nil, &block) 4 return if @level > severity 5 message = (message || (block && block.call) || progname).to_s 6 # If a newline is necessary then create a new message ending with a newline. 7 # Ensures that the original message is not mutated. 8 message = "#{message}\n" unless message[-1] == ?\n 9 severity_text = ActiveSupport::BufferedLogger::Severity.constants.detect{|c| eval(c) == severity}.ljust(5) 10 time_text = Time.now.strftime('%Y-%m-%d %H:%M') 11 buffer << "#{time_text} [#{severity_text}] #{message}" 12 auto_flush 13 message 14 end 15 end 16 end

こんなファイルを作って置いてみた。

で、出したいようにログが出るようになった。しかし自分でやっておいてなんだけど、置き換えたadd大きすぎ。不吉な匂いを放ってる気がする。

ちなみに上の「buffered_logger.rb」は2.1.0なのだけれど、2.0.2では

activesupport-2.0.2/lib/active_support/buffered_logger.rb

60 message = "#{message}\n" unless message[-1] == ?\n 61 @buffer << message 62 auto_flush

と、bufferのスコープがローカルではないので、注意が必要。って、あーやっぱりきれいなやり方じゃないよなー。

タイトルとURLをコピーしました