15

いくつかのコントローラーといくつかのレーキタスクを備えた単純なRailsアプリケーションがあります。いくつかのタスクは、everygemで構成されたcronによって実行されます

私のタスクの1つは毎日実行され、例外が発生することがあります。デフォルトでは、cronによってこの警告が表示されます。

rake aborted!
undefined method `parameterize' for nil:NilClass

Tasks: TOP => mailboxes:clean_processed
(See full trace by running task with --trace)

何が起こっているのかをデバッグしたいので、この行を使用してこの例外通知gemをインストールしました。Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier'

application.rb私のファイルでそれを設定しました

# enable exception notification
config.middleware.use ExceptionNotifier,
                      :email_prefix => "[MyAppName] ",
                      :sender_address => %{"notifier" <report@example.com>},
                      :exception_recipients => %w{me@example.com}

このgemはラックミドルウェアであるため、Webリクエストに対してのみ機能し、rakeタスクに対しては機能しません。レーキタスクでも有効にしたいのですが、この要点がその役割を果たしていることがわかりました。

それは機能しますが、DRYではありません。そのメソッドでgem構成を繰り返す必要があります。また、すべてのrakeタスクを変更して、ステートメントを次のようにブロックで囲む必要があります。

exception_notify { actual_task_code }

これを解決するためのより良い方法はありますか?

PSプロジェクトに数行のコードを追加しただけなので、通知gemを変更する必要がある場合でも問題はありません。

PPS crontabのレーキラインを変更してオプションを追加することもできることは知ってい--traceますが、その解決策は好きではありません。例外通知機能imhoは、Webコードでも役立つ優れた解決策です。

更新私はちょうどこの関連する質問を見つけました:delayed_jobのexception_notificationですが、両方の答えは同様のトリックを使用しています。

Airbrake(旧称hoptoad)やExceptionalなどのオンラインサービスを試してみますが、どちらも有料サービスです...

アップデート2:非常に優れたアプリケーションであるAirbrakeアプリを試しましたが、同じ問題が発生します。Rakefileをハックして、rakeタスクからの例外を通知する必要があります。ただし、次のコードが必要なだけなので、ハックはそれほど乾燥していません。

# notify exceptions
def exception_notify
  yield
rescue Exception => exception
  HoptoadNotifier.notify exception
  raise exception
end

構成パラメーターを繰り返す必要はありません。レーキタスクの例外の通知を受け取るには、これ以上のことはできないと思います。

4

4 に答える 4

15

config / initializersにtask.rbファイルを作成します。これは、モンキーパッチでRake :: Task#executeを実行して、exception_notifyの機能を追加します。

module Rake
  class Task
    alias :orig_execute :execute
    def execute(args=nil)
      orig_execute(args)
    rescue Exception => exception
      # Exception notification stuff
    end
  end
end

Rails 3.0.12、Rake0.9.2.2でテスト済み。

于 2012-05-29T21:19:24.903 に答える
6

新しい簡単な解決策があります:gem https://github.com/nikhaldi/exception_notification-rake

于 2013-02-23T21:31:44.830 に答える
4

エアブレーキの宝石はRakeにパッチを当てて救助できるようにしているので、私が求めていることはすでに実行されています...

于 2012-05-15T17:46:46.460 に答える
1

この提案をありがとう。現時点ではcronタスクが1つしかないため、これは私にとって非常に効果的です。

乾かすには、おそらくhttps://github.com/cjbottaro/app_configを使用して、構成を定数に変換できますAPP_CONFIG

さらに、task :... doすべてをでラップするために、クラスが処理するものを拡張できますexception_notify { }

于 2011-10-08T11:18:08.030 に答える