RailsのエラーをSlackに通知
環境
gem exception_notification
Railsアプリケーションでエラーが発生した際に、通知を送る為の機能を提供してくれるgemです。
公式:
GitHub - smartinez87/exception_notification: Exception Notifier Plugin for Rails
使用例
開発環境でこちらを参考に開発環境でEmailでの送信を試してみたいと思います。
補足: letter_opener
を使用しています!!
config/environments/development.rb
Rails.application.configure do ・・・ config.action_mailer.delivery_method = :letter_opener config.action_mailer.default_url_options = { host: 'localhost:3000' } config.action_mailer.raise_delivery_errors = true config.action_mailer.perform_deliveries = true ・・・ end
設定用のファイルを下記のコマンドで作成します。
rails g exception_notification:install
デフォルトでEmail用の設定は生成されるのでそのままでokです。 config/initializers/exception_notification.rb
require 'exception_notification/rails' ExceptionNotification.configure do |config| config.add_notifier :email, { email_prefix: '[ERROR] ', sender_address: %{"Notifier" <notifier@example.com>}, exception_recipients: %w{exceptions@example.com} } end
適当な箇所で例外を発生させてみます。
class StaticPagesController < ApplicationController def top raise end end
Slack通知を実装する
まずは下記をGemfileに追加してbundleします。
gem 'slack-notifier'
こちらのページから設定を行っていきます。
- 通知先のワークスペースを選択します。
- 通知先のチャンネルを選択します。
- 設定を保存したら完了です。
rails consoleで送れるか試してみます。
> WEBHOCK_URL = <自分のWebhook URL> > channel = "#基礎編通知" > username = "tanaka" > Slack::Notifier.new(WEBHOOK_URL, channel: channel, username: username).ping('Hello World') => [#<Net::HTTPOK 200 OK readbody=true>]
Slackを確認すると通知が送られているのが確認できると思います。
確認できたら、slack用の設定をconfig/initializers/exception_notification.rb
に追加します。
require 'exception_notification/rails' ExceptionNotification.configure do |config| # Slack notifier config.add_notifier :slack, { webhook_url: <自分のWebhook URL> channel: "#基礎編通知", } end
サーバーを立ち上げ直した後、エラーを発生させるとSlackに通知が届いているはずです。
404、500エラーに対してエラーハンドリング処理を実装する
まず、開発環境で本番環境のエラー画面を確認できるように下記の設定を行います。
config/environmentst/development.rb
config.consider_all_requests_local = false
404エラー
間違ったURLにアクセスした場合に発生します。
このHTMLはpublic/404.html
を表示しています。
500エラー
サーバー側でのエラーの場合に発生します
このHTMLはpublic/500.html
を表示しています。
500エラーの場合はログに「エラーメッセージ」と「エラーのバックトレース」を表示させたいと思います。
application_controller.rb
class ApplicationController < ActionController::Base rescue_from StandardError, with: :render_500 private def render_500(exception) logger.error(exception.message) logger.error(exception.backtrace.join("\n")) render file: Rails.root.join('public/500.html'), status: :internal_server_error, layout: false, content_type: 'text/html' end end
参考:
レイアウトとレンダリング - Railsガイド
class Exception (Ruby 2.7.0 リファレンスマニュアル)
最後に
開発環境でエラー表示の詳細が表示されるようにtrue
に戻します。
config/environmentst/development.rb
config.consider_all_requests_local = true
また、開発環境でSlackに通知が送信されないようにconfig/initializers/exception_notification.rbに下記を追加します。
if Rails.env.production? require 'exception_notification/rails' ExceptionNotification.configure do |config| ・・・ end end