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

2014-11-06

rubyで一時的にワーニングなしで定数を変更する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyで定義済みの定数の値を変更するとワーニングが出力されます。

これは本来ありがたい仕様だと思うのですが、
今回、どーしても一時的に定数を書き換えたいケースがでました。

ワーニングが出るだけで動きに支障はないので、そのままでもよかったのですが
なんとなくワーニングが消せないかなぁと調べてみました。

以下のような感じでできました。
一時的な変更と言うより、一回削除して再作成です。

class A
  MOGE="momomo"
end

p A::MOGE
-> "momomo"

muga = A::MOGE

A.send :remove_const, :MOGE

A::MOGE = "mimimi"

p A::MOGE
-> "mimimi"

A.send :remove_const, :MOGE

A::MOGE = muga

p A::MOGE
-> "momomo"


これでクラスやモジュールに定義されている定数をワーニングなしで一時的に置き換えることができました。

ちなみにグローバルに定義している定数の場合は、以下のような感じです。

HOGE = "hohoho"

p HOGE
-> hohoho"

fuga = HOGE

Object.send :remove_const, :HOGE

HOGE="hihihi"

p HOGE
-> "hihihi"

Object.send :remove_const, :HOGE

HOGE = fuga

p HOGE
-> "hohoho"