こんにちは、tahara です。
Rails のエラー通知に Exception Notifier を使われてたりすると思いますが、 JavaScript のエラー通知はみなさんどうされているのでしょうか?
ちょっと探してみたのですが、これだ! というもの見つからず、 PipelineDeals Dev Blog - PipelineDeals Dev blog - Javascript error reporting for fun and profit を参考にメールで JavaScript のエラー通知を行うようにしてみました。
- JavaScript の window.onerror でエラーをつかまえる。
- jQuery.post でエラー情報をサーバに送信。
- サーバで ActionMailer を使ってエラー情報をメール送信する。
app/assets/javascripts/onerror.js
// Determine if the error occurred before or after document ready jQuery(function() { window.documentIsReady = true; }); window.onerror = function(errorMsg, file, lineNumber) { // report a maximum of n errors window.errorCount || (window.errorCount = 0); if (window.errorCount <= 3) { window.errorCount += 1; // post the error with all the information we need. jQuery.post('/javascript_error', { error: errorMsg, file: file, location: window.location.href, lineNumber: lineNumber, documentReady: window.documentIsReady, userAgent: navigator.userAgent }); } };
- window.onerror で、エラーメッセージ等をサーバに POST します。
- window.documentIsReady でエラーがおきたのが DOM 構築前か後か、わかるようにしてあります。
- window.errorCount で1ページで3件をこえてエラーを通知しないようにしています。
app/controllers/javascript_error_controller.rb
# -*- coding: utf-8 -*- class JavascriptErrorController < ApplicationController def index # 同じエラー1時間通知しない。 Rails::cache.fetch("javascript_error #{params[:file]} #{params[:lineNumber]}", :expires_in => 1.hours) do Notifier.javascript_error(params).deliver true end head :ok end end
- ActionMailer でメールを送るだけ。
- memcached バックエントのキャッシュ使って、同じエラーを1時間の間は通知しないようにしています。
こんな感じで、JavaScript エラーがメールで通知されるようになりました。 もっとエレガントな方法があれば教えてください。
定期的に JavaScript のエラー殲滅デー をもうけて、品質を上げていきたいと思います。