15

Ho una semplice applicazione di guide con alcuni controller e alcune attività di rake. Un paio di attività sono eseguite da cron configurato con whenever gem.Notificatore di eccezioni Rails nelle attività di rake

Un mio compito viene eseguito ogni giorno e qualche volta si solleva un'eccezione e per impostazione predefinita ricevo questo avvertimento da cron

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

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

voglio eseguire il debug di quello che sta succedendo e per questo motivo che ho appena installato questo exception notification gemma con questa linea nella mia Gemfile

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

e configurato nel mio file application.rb con

# enable exception notification 
config.middleware.use ExceptionNotifier, 
         :email_prefix => "[MyAppName] ", 
         :sender_address => %{"notifier" <[email protected]>}, 
         :exception_recipients => %w{[email protected]} 

Poiché questa gemma è un middleware rack, funziona solo per le richieste Web e non per le attività rake. Mi piacerebbe abilitarlo anche per le attività di rake e ho trovato this gist che fa il lavoro.

Funziona, ma è non secca, ho bisogno di ripetere la configurazione gioiello a quel metodo e ho anche bisogno di cambiare tutti i miei compiti rake per racchiudere le loro dichiarazioni in un blocco come in

exception_notify { actual_task_code } 

C'è qualche modo migliore per risolvere questo?

P.S. Se ho bisogno di cambiare la notifica gem non sarebbe un problema perché ho aggiunto solo poche righe di codice al mio progetto.

P.P.S. So che posso anche cambiare la linea di rastrello nel crontab per aggiungere un'opzione --trace, ma non mi piace quella soluzione, causa il notificatore di eccezione imho è una soluzione migliore che aiuta anche nel codice web.

Aggiornamento Ho appena scoperto questa domanda correlata: exception_notification for delayed_job ma entrambe le risposte utilizzano un trucco simile.

ho intenzione di provare con un servizio online come Airbrake (precedentemente noto come hoptoad) o eccezionale, ma entrambi sono pagati i servizi ...

Update 2: ho provato il Airbrake App, molto bella applicazione, ma soffre per lo stesso problema, ho ancora bisogno di hackerare il Rakefile per notificare le eccezioni dalle attività di rake. Tuttavia l'hack è meno asciutto perché hai solo bisogno di questo codice:

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

Non è necessario ripetere alcun parametro di configurazione. Penso di non poter fare di meglio per ricevere notifiche delle eccezioni nelle attività di rake.

risposta

5

Airbrake gemma patches Rake per consentire salvataggio, in modo che già fa quello che sto chiedendo ...

+0

Per abilitare la registrazione degli errori di Rake, è necessario aggiungere la riga '' 'config.rescue_rake_exceptions = true''' a' '' conifg/initializers/airbrake.rb'''. – KurtPreston

1

Grazie per questo suggerimento; Funziona benissimo perché ho solo un compito cron al momento.

ad asciugare in su, si potrebbe trasformare la configurazione in costanti, magari attraverso APP_CONFIG: https://github.com/cjbottaro/app_config

Inoltre, si potrebbe estendere qualsiasi classe si prende cura di task :... do di avvolgere tutto in exception_notify { }.

+1

Mi interessa l'ultima suggerimento, potrebbe si espande un po '? – Fabio

+0

Devi scavare nel modo in cui le attività di rake funzionano, più in profondità nel framework Rails. Neanche io conosco i dettagli. Ma potresti estendere quelli classificati per fare quello che vuoi. –

13

Creare un file task.rb in config/inizializzatori, quali patch scimmia Rake :: Task # eseguire per includere il funzionalità di 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 

Testato con Rails 3.0.12, Rake 0.9.2.2.

+1

Si prega di notare che è necessario richiedere "rake/task", o la console di Rails non verrà più eseguita a causa di un NameError. –

Problemi correlati