デバッグ用の文字列をログファイルに書き出す
ログファイルに書き出す
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