logrageはRailsのログをスッキリ表示してくれるツールだ。
こいつが何をやっているか説明する前に、Railsではどのようにログが出力されているかを知る必要がある。
Rails3以降ではログ出力にActiveSupport::Notificationsの仕組みを使うようになった。
これはイベントの発信と受信の仕組みを提供するもので、特定のイベントに反応するリスナーを登録しておくとイベント発生時にそのリスナー(実体はブロック)がコールされる。
Railsでは各種のイベントに応じて、それをログに記録する役割を持つログサブスクライバと呼ばれる物があり、イベントが発生してそれが呼ばれたら、内部でRails.logger(ActiveSupport::Loggerのインスタンス)に対してログ出力させている。
で、logrageは何をするかというと、デフォルトでリッスンしているログサブスクライバをことごとく無効化し、代わりに自分(lograge)がそれらのイベントをリッスンするようにしてるのだ。
使い方
Gemfile
gem 'lograge'
config/environments/development.rb
config.lograge.enabled = true
config.lograge.custom_options = lambda do |event|
{:time => event.time}
end
config.log_level = :info
これだけで、log/development.logの出力がシンプルになる。
もし、デフォルトのログはそのまま活かしたまま、別にシンプルなログを出したい場合は以下を追加する。
config.lograge.keep_original_rails_log = true
config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/lograge_#{Rails.env}.log"
これで、log/development.logにはデフォルトのRailsログが、そして、log/lograge_development.logにはシンプルなログが出るようになる。
出力する内容を追加したいときには以下のようにする。
app/application_controller.rb
def append_info_to_payload(payload)
super
payload[:host] = request.host
payload[:ua] = request.user_agent
end
config/environments/development.rb
config.lograge.custom_options = lambda do |event|
{ time: event.time, host: event.payload[:host], ua: event.payload[:ua] }
end
application_controller.rbのコードはActiveSupport::Notificationsのイベントリスナーのブロックに渡すデータをカスタマイズするメソッドで、これはActionControllerに元々定義されているメソッドのオーバーライドをしている。
これによって追加されたデータをdevelopment.rbで使うように設定しているというわけだ。
諸々の注意
- エラーが発生した時にはuaとかhostとかはログにあらわれてくれない。