exception_notificationを使う手順
エラーが発生するとメールが飛んでくるgem、exception_notificationをやってみた。
やることの目次
やることはざっとこんな感じ。
Railsをnewする
$ rails new notifi--- -T
アプリ名は適当。オプションTを付けるとUnitTestディレクトリを作成しない。
どうせRSpec入れるしこの段階から作らないほうがよい。
SMTPサーバの用意
メールサーバにGmailを使ってもよいけど今回はMailCatcherという仮想STMPサーバをたてるgemを使う。
使い方はすごく簡単。テスト用にはもってこい。
Gemfileにmailcatcherを追加。
# Gemfile gem 'mailcatcher'
$ bundle install
mailcatcherのSMPTサーバを起動
起動はワンコマンドでおk。
$ mailcatcher Starting MailCatcher ==> smtp://127.0.0.1:1025 ==> http://127.0.0.1:1080 *** MailCatcher runs as a daemon by default. Go to the web interface to quit.
exception_notificationをインストール
まずexception_notificationをGemfileに追加する。
# Gemfile gem 'exception_notification'
保存後
$ bundle
設定ファイルを修正する
修正する内容は
- メール送るようにする
- SMTPサーバの設定する
- エラーメールの情報を設定する
メールを送るようにする
development環境では、デフォルトでメールを送らない設定になっているので以下のように修正する。
#app_root/config/environments/development.rb - config.action_mailer.raise_delivery_errors = false + config.action_mailer.raise_delivery_errors = ture
SMTPサーバ設定
SMTPサーバの設定の書き方は、本家にRails用の書き方があったのでそれに従う。
https://github.com/sj26/mailcatcher
application.rbに下記のコードを追加。
# app_root/config/application.rb config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "localhost", :port => 1025 }
exception_notificationの設定をする
config/environments/development.rbにエラー時に送信されるメールの情報を書く
情報は、メールのタイトルに付加する文字列、送信者名、送信相手のメールアドレスが必要。
以下のコードは本家に書いてあったのでそのまま拝借。
#app_root/config/environments/development.rb config.middleware.use ExceptionNotifier, :email_prefix => "[Whatever] ", :sender_address => %{"notifier" <notifier@example.com>}, :exception_recipients => %w{exceptions@example.com}
(エラー発生させる用)コントローラーを作成
なんでもよいので適当に作成する。
$ rails g controller home index create app/controllers/home_controller.rb route get "home/index" invoke erb create app/views/home create app/views/home/index.html.erb invoke helper create app/helpers/home_helper.rb invoke assets invoke coffee create app/assets/javascripts/home.js.coffee invoke scss create app/assets/stylesheets/home.css.scss
このままだと正常終了してしまうので、HomeController#indexに例外を発生させるコードを加えなければならない。
以下を追加する。
raise 'aaa'
以下のようになる。
class HomeController < ApplicationController def index + raise 'aaa' end end
エラーを発生させてメールの確認
以下のエラーについては通知対象から外れている。
- ActiveRecord::RecordNotFound
- AbstractController::ActionNotFound
- ActionController::RoutingError