HerokuでLogging(gem)とSendgrid(add-on)を使ってエラーログをメール通知する

config/application.rbに以下の様なコードを書いて、Rails.loggerをLoggingに差し替える。
特筆すべきところはありません。あえて言うならば、出力先はログファイルでも標準出力でもどちらでも良さそうだということでしょうか。

    Logging.init :debug, :info, :warn, :error, :fatal
    config.logger = Logging::Logger['server'].tap do |l|
      l.add_appenders Logging.appenders.file(
        config.paths.log.paths.first,
        :layout => Logging::Layouts::Pattern.new(:pattern => "[%d][%l][PID:%p] %m\n")
        )
    end

productionでのみメール通知をする場合はconfig/environments/production.rbに以下のようなコードを書きます。
ここでも注意どころなく、SendgridアドオンのSMTPサーバを使えばよいだけです。

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address        => "smtp.sendgrid.net",
    :port           => "25",
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => ENV['SENDGRID_DOMAIN']
  }

  config.logger.add_appenders Logging::Appenders::Email.new('email',
    :from         => 'FROM',
    :to           => 'TO',
    :server       => config.action_mailer.smtp_settings[:address],
    :port         => config.action_mailer.smtp_settings[:port],
    :domain       => config.action_mailer.smtp_settings[:domain],
    :acct         => config.action_mailer.smtp_settings[:user_name],
    :passwd       => config.action_mailer.smtp_settings[:password],
    :authtype     => config.action_mailer.smtp_settings[:authentication],
    :level        => :warn,
    :immediate_at => 'warn,error,fatal',
    :subject      => 'SUBJECT',
    :layout       => Logging::Layouts::Pattern.new(:pattern => '[%d][%l][PID:%p] %m\n')
    )

というわけで、特筆すべきこともなくエラーログをメール通知することができました。

以下はおまけです。

  • GmailSMTPサーバはTLSSSLで接続する必要があるが、Loggingでは#enable_tlsも#enable_sslも実行してくれない罠
  • 無償だから使っていたHoptoadアドオンは無償版がなくなった
  • 無償だからHoptoadから乗り換えたExceptionalアドオンも無償版がなくなった
  • 流れ的にSendgridもそのうち無償版なくなるんじゃなかろうか…?
  • 未だに、エラー通知のベストプラクティス的なものがわからずLogging一本槍(自腹ならHoptoadあたりを選択する気がしないでもない)

2011/05/11 追記

> 特筆すべきところはありません。あえて言うならば、出力先はログファイルでも標準出力でもどちらでも良さそうだということでしょうか。

Loggingアドオンを使うと、 config.paths.log.paths.first に書き込んでも記録されない様です。記録されないのか、heroku logsで見えないのか、実際のところは把握してませんが…。
Railsのログ出力先は標準出力にしておかないと駄目なようです。

2011/06/22 追記

Herokuの/app/vendor/plugins/rails_log_stdout/init.rbによってRails.loggerが置き換えられてしまうという事に気づきました。config/initializers/*.rbなどを使って差し戻す必要があるようです。
ちなみに、ActiveRecord::Base.loggerやActionController::Base.loggerは置き換えられません。