Ответ 1
Airbrake gem исправления 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
Нет необходимости повторять какой-либо параметр конфигурации. Я думаю, что я не могу сделать лучше, чем это, чтобы получать уведомления об исключениях в рейк-задачах.
Airbrake gem исправления Rake, чтобы позволить спасти, поэтому он уже делает то, что я прошу...
Создайте файл 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.
есть новое более легкое решение: gem https://github.com/nikhaldi/exception_notification-rake
Спасибо за это предложение; он отлично работает для меня, так как на данный момент у меня есть только одна задача cron.
Чтобы сушить его, вы можете превратить конфигурацию в константы, возможно, через APP_CONFIG
:
https://github.com/cjbottaro/app_config
Кроме того, вы можете расширить любой класс, заботясь о task :... do
, чтобы обернуть все в exception_notify { }
.