2014-11-24

railsのログに情報を追加する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsのログに情報を簡単に追加する方法として
config.log_tags
を利用する方法があります。

config/environment/develpment.rb

config/environment/production.rb
に以下のように書くとセッションIDとリモートIPをログに追加できます。
config.log_tags = [ :uuid, :remote_ip ]

ここでふと、このlog_tagsにはどんなものが記載できるのだろう?と思ってみたわけです。

調べてみたところ、log_tagsで記載した内容が、実際にログにタグとして追加する処理は以下のcompute_tagsの部分で行っているようです。
https://github.com/rails/rails/blob/21a71cd5d8f266252278a63316a99cc403a32cad/railties/lib/rails/rack/logger.rb#L57

Sybolとして指定したものは、requestオブジェクトのメソッドとして呼ばれるようです。なのでrequestオブジェクトのメソッドがここで指定できる候補になります。

実際に、以下のようにuser_agentを追加してみたら
config.log_tags = [ :uuid, :remote_ip, :user_agent ]

以下のようなログが出力されました。
[a0b386ac-c108-4820-be22-4fbf8d14a1e8] [10.10.10.10] [Mozilla/5.0(Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36] Processing by WelcomeController#index as HTML

log_tagsで指定できるのは、Symbol以外にProcも指定できて、この場合はProcオブジェクトにrequestオブジェクトを引数として渡されて処理されるようです。
またそれ以外に、文字列を指定した場合は、その文字列が単純にセットされるようです。

ただrequestのメソッドならば、なんでもSymbolで指定したり、Proc内で処理できるわけではなさそうです。sessionなどは処理できませんでした。
どうも、通常は、ログの処理よりもセッションの処理の方が後に行われるようで、sessionを指定してもログの処理の段階ではセッションの処理がまだ行われていないことが原因のようです。

なので、以下のサイトで紹介されているように、処理の順番を入れ替えることでsessionも扱えるようになるようです。
http://threetreeslight.com/post/51883603368/rails-id-ip

コメントを投稿