Rails つまみぐい

読者です 読者をやめる 読者になる 読者になる

Rails つまみぐい

Ruby on Rails 初学者による行き当たりばったりなメモ

デバッグ用の文字列をログファイルに書き出す

ログファイルに書き出す

Railsの実行時に処理されるコードの中で

logger.debug("ログに吐き出す文字列")

と書いておけば、ログファイル log/development.logに書き出されます(実行モードがdevelopmentのとき限定)。

ログに書き出される情報は以下の5つのレベルのどれかに分類されていて、どのレベルでログを書き出すかで、使用するメソッドが異なります。

:debug logger.debug (デバッグ情報)
:info logger.info (一般的な情報)
:warn logger.warn (警告情報)
:error logger.error (エラー情報)
:fatal logger.fatal (致命的なエラー情報)


なお、productionモードではデフォルトの設定だとlogger.debugは記録されません。ログの内容にはレベルがありproductionモードでは実行に影響ないものは残さない、ということなのでしょう。

ですのでproductionモードでログに書き出したい場合はlogger.infoなぞを使って

logger.info("ログに吐き出す文字列")

と書けばよいでしょう。

オブジェクトの中身を記録する

デバッグしていると、このオブジェクトの中身はどうなっているんだろう?ってことがよくあります。

文字列や数字の変数ならそのまま var.to_s や "%s"%var で文字列化してしまえばいいですが、オブジェクトでそれをやると #<ClassName:0xXXXXXXX> みたいな訳分からん文字になってしまいます。

そんなときは .inspect を使うと便利。

logger.debug(var.inspect)


パスワードなどをログに残さないようにしよう

デフォルトの設定で、アクセスがあったときに与えられたパラメータがログファイルに書き出されます。

Started POST "/users" for 192.168.1.20 at 2012-01-01 00:00:00 +0900
Processing by UsersController#index as HTML
  Parameters: {"username"=>"Oratok", "password"=>"[FILTERED]"}
Completed 200 OK in 149ms (Views: 148.3ms | ActiveRecord: 0.0ms)

3行目の"password"の値が[FILTERED]となって隠されています。この設定はデフォルトでconfig/application.rbファイル内で書かれています。

module RailsApp
  class Application < Rails::Application
    config.filter_parameters += [:password]
  end
end

"password"というキーに反応して隠しているわけです。この行を消すとアクセスしたユーザーが入力したパスワードがログ上にもろにでてしまうわけです。

隠す対象のキーを追加したい場合はこんな感じで。

module RailsApp
  class Application < Rails::Application
    config.filter_parameters += [:password, :passwd]
  end
end


参考サイト