Исключатель исключений Rails в задачах rake

У меня есть простое рельсовое приложение с несколькими контроллерами и некоторыми рейк-задачами. Несколько задач выполняются cron, сконфигурированным с всякий раз, когда gem.

Одна из моих задач выполняется ежедневно, а иногда возникает исключение, и по умолчанию я получаю это предупреждение cron

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

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

Я хочу отладить, что происходит, и по этой причине я только что установил этот уведомление об исключении с этой строкой в ​​моем 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" <[email protected]>},
                      :exception_recipients => %w{[email protected]}

Поскольку этот камень является промежуточным программным обеспечением для стойки, он работает только для веб-запросов, а не для задач рейка. Я хотел бы включить его также для задач rake, и я нашел этот смысл, который выполняет эту работу.

Он работает, однако не DRY, мне нужно повторить конфигурацию gem в этом методе, и мне также нужно изменить все мои задачи rake, чтобы заключить их инструкции в блок, как в

exception_notify { actual_task_code }

Есть ли лучший способ решить эту проблему?

P.S. Если мне нужно изменить звуковой сигнал уведомления, это не будет проблемой, потому что я добавил в проект только несколько строк кода.

P.P.S. Я знаю, что я также могу изменить строку rake в crontab, чтобы добавить параметр --trace, но мне не нравится это решение, потому что исключение notifier imho - лучшее решение, которое также помогает в веб-коде.

Обновление Я только выяснил этот связанный вопрос: exception_notification для delayed_job, но оба ответа используют подобный трюк.

Я собираюсь попробовать с онлайн-сервисом, таким как Airbrake (ранее известный как hoptoad) или Exceptional, но оба они - платные услуги...

Обновление 2: я попробовал Airbrake App, очень приятное приложение, но он страдает от той же проблемы, Мне все равно нужно взломать Rakefile, чтобы уведомлять исключения из задач рейка. Однако взлом менее сух, потому что вам просто нужен этот код:

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

Нет необходимости повторять какой-либо параметр конфигурации. Я думаю, что я не могу сделать лучше, чем это, чтобы получать уведомления об исключениях в рейк-задачах.

Ответы

Ответ 1

Airbrake gem исправления Rake, чтобы позволить спасти, поэтому он уже делает то, что я прошу...

Ответ 2

Создайте файл task.rb в config/initializers, в котором обезьяны исправляют 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, Rake 0.9.2.2.

Ответ 4

Спасибо за это предложение; он отлично работает для меня, так как на данный момент у меня есть только одна задача cron.

Чтобы сушить его, вы можете превратить конфигурацию в константы, возможно, через APP_CONFIG: https://github.com/cjbottaro/app_config

Кроме того, вы можете расширить любой класс, заботясь о task :... do, чтобы обернуть все в exception_notify { }.