Ruby on Rails のログフォーマット変更

Ruby on Railsのログ出力内容を見てみると、時刻が出力されていません。
時刻とログレベルぐらいは出力しておきたい。っていうか、どこでフォーマット変えれるの?
というわけで、設定してみました。

<僕が使っている環境>
ruby 2.0.0p247 (32bit)
DevKit-mingw64-32-4.7.2-20130224-1151-sfx (32bit)
rails 3.2.14
Windows7 (64bit)


(1)はじめに
[Rubyインストール先]\lib\ruby\gems\2.0.0\gems\activesupport-3.2.14\lib\active_support\core_ext\logger.rb
に、Loggerの定義が書かれているみたいです。

Railsのデフォルトのログフォーマットは、logger.rbの中の、SimpleFormatterで定義されている内容が使われているみたいです。

また、カスタマイズの書き方は、こちらのサイト(Active Support Core Extensions — Ruby on Rails Guides)の、「20.3 datetime_format=」に記載されています。

(参考)
Logger!!! (ログにタイムスタンプを追加する方法) – うんたらかんたらRuby – Rubyist
[道] railsのログへ時刻/PID付与 | 今日もねむひ(-。-)zZZ


(2)やり方その1 とりあえず簡単に!
[RailsアプリのDirectory]/config/environments/development.rb
に、以下の設定を追加する。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::Formatter.new

そうすると、ログ出力内容はこんな感じになります。

I, [2013-11-26T22:38:52.008516 #37856] INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 22:38:52 +0900
I, [2013-11-26T22:38:52.281531 #37856] INFO -- : Connecting to database specified by database.yml
I, [2013-11-26T22:38:53.385594 #37856] INFO -- : Processing by FinanceController#bye as HTML

#37856というのは、プロセスIDになります。


(2)やり方その1 パート2
[RailsアプリのDirectory]/config/environments/development.rb
に、もうひとつ加えることで、日付のフォーマットをカスタマイズできます。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::Formatter.new
  config.logger.datetime_format = "%Y-%m-%d %H:%M:%S"

ログ出力内容はこんな感じ

I, [2013-11-26 22:54:28#38012] INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 22:54:28 +0900
I, [2013-11-26 22:54:28#38012] INFO -- : Connecting to database specified by database.yml
I, [2013-11-26 22:54:29#38012] INFO -- : Processing by FinanceController#bye as HTML

(3)やり方その2 フルカスタマイズ
[RailsアプリのDirectory]/config/environment.rb
の中に、フォーマットを定義します。ここでは、FormatWithTimeという名前で定義しています。($$は、pidを表します)

(注)「Initialize the rails application」の後に書くと、エラーになります。

# Load the rails application
require File.expand_path('../application', __FILE__)

class Logger::FormatWithTime < Logger::Formatter
  cattr_accessor(:datetime_format) { "%Y%m%d%H%m%S" }

  def call(severity, timestamp, progname, msg)
    "[#{timestamp.strftime(datetime_format)}.#{'%06d' % timestamp.usec.to_s}] (pida=#{$$}) #{severity} -- : #{String === msg ? msg : msg.inspect}\n"
  end

end

# Initialize the rails application
Test02Mysql::Application.initialize!

その後、
[RailsアプリのDirectory]/config/environments/development.rb
の中で、config.logger.formatter = Logger::FormatWithTime.new
すると、フォーマットが設定されます。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::FormatWithTime.new

ログ出力内容はこんな感じ。

[20131126231146.572204] (pid=39496) INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 23:22:46 +0900
[20131126231146.883222] (pid=39496) INFO -- : Connecting to database specified by database.yml
[20131126231148.018287] (pid=39496) INFO -- : Processing by FinanceController#bye as HTML
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s