コントローラに include すると standard error を rescue するようになる
Add this line to your application's Gemfile:
gem 'ans-handle_standard_error'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ans-handle_standard_error
class Posts < ActionController::Base
include Ans::HandleStandardError
private
def rescue_from_standard_error_render(e)
render "not_found", status: 500
end
end
production 環境の場合のみ、 rescue_from StandardError, with: :rescue_from_standard_error
を設定する
最終的な表示の部分は rescue_from_standard_error_render
メソッドによって行う
このメソッドには、発生した例外が渡される
デフォルトは発生した例外を再度 raise
エラーログは例えば以下のように確認する
$ grep -f log/error.log log/production.log -A 100 -B 100
logger で発生した例外メッセージと、バックトレースを出力する
これにより、通常のログファイルにエラーが書き込まれる
エラーメッセージにはハッシュタグを含め、ハッシュタグは error.log に出力する
logger は通常のログファイルに書き込むので、
- エラーが起こったこと
- エラーの位置
の検出が難しい
これをハッシュタグで解決しようとしている
ハッシュタグは ==id== 時間
の形式
エラーメッセージとバックトレースを囲むように出力している
rescue_from_standard_error_id
rescue_from_standard_error_log
rescue_from_standard_error_render(e)
self.rescue_from_standard_error?
- 発生した例外のメッセージとバックトレースを
logger.fatal
でログに書き出す - ハッシュコードを生成して
logger.fatal
でログに書き出す - log/error.log にハッシュコードを出力する
rescue_from_standard_error_render
メソッドをコールする
エラーログに出力するハッシュコードを生成する
デフォルトは "==#{SecureRandom.hex(20)}== #{Time.now}"
エラーログの絶対パスを返す
デフォルトは Rails.root.join("log/error.log")
rescue_from_standard_error
メソッドの最後に呼び出され、適切なテンプレートの描画を行う
デフォルトは raise e
(発生した例外の再掲)
include Ans::HandleStandardError
の前に、以下のように再定義する
class Posts < ActionController::Base
module ::Ans::HandleStandardError
def self.rescue_from_standard_error?
true
end
end
include Ans::HandleStandardError
end
デフォルトは Rails.env.production?
開発時に、一時的に有効にするときなどに再定義する
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request