2014-12-18 12 views
11

Ich arbeite derzeit mit Sellerie-Aufgaben in einem Django-basierten Projekt. Wir haben Raven konfiguriert, um alle nicht abgefangenen Ausnahmen und Protokollnachrichten an Sentry zu senden, wie in der documentation beschrieben.Sellerie Aufgaben nicht abgefangene Ausnahmen werden nicht an Sentry gesendet

Alles funktioniert ziemlich gut, mit Ausnahme von nicht abgefangenen Ausnahmen in Sellerie Aufgaben. wenn ich diese Aufgabe zum Beispiel laufen:

@app.task 
def test_logging(): 
    log.error('Testing logging inside a task') 
    raise IndexError('Testing exception inside a task') 

Ich sehe nur in Sentry die log.error(...) aber nicht die IndexError abgefangene Ausnahme. Ich habe versucht, eine try-except Block um die Ausnahme mit einer log.exception(...) innerhalb und es hat funktioniert, aber ich denke, es ist nicht skalierbar, alle Ausnahmen wie diese zu fangen.

Also, das Problem sind nur nicht abgefangene Ausnahmen, die irgendwie nicht richtig behandelt werden. Das sind meine aktuellen Paketversionen

:

celery (3.1.17) 
raven (5.1.1) 
Django (1.7.1) 

Würden Sie mir helfen, in irgendeiner Richtung zu bewegen?

Danke für Ihre Zeit!

+0

haben Sie bereits http://raven.readthedocs.org/en/latest/integrations/sellery.html und http://docs.selleryproject.org/en/latest/configuration.html#celeryd-hijack-root ausprobiert -Logger? – DRC

+1

Danke DRC, schließlich hat die Lösung mit 'register_signal (client) 'funktioniert, und jetzt sehen wir, dass die nicht abgefangenen Ausnahmen in Sentry korrekt protokolliert wurden. Prost! –

+0

froh, dass es geholfen hat. – DRC

Antwort

15

Wie es oben im Kommentar von DRC beschrieben, erhielten wir schließlich auf die Lösung mit diesem Ansatz: https://docs.getsentry.com/hosted/clients/python/integrations/celery/

Im Grunde tut dies:

import celery 

class Celery(celery.Celery): 

    def on_configure(self): 
     if hasattr(settings, 'RAVEN_CONFIG') and settings.RAVEN_CONFIG['dsn']: 
      import raven 
      from raven.contrib.celery import (register_signal, 
               register_logger_signal) 

      client = raven.Client(settings.RAVEN_CONFIG['dsn']) 
      register_logger_signal(client) 
      register_signal(client) 


app = Celery('myapp') 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

Vielen Dank für Ihre Zeit.

+0

In welche Datei schreiben Sie diese Konfiguration für Sellerie, um sie zu lesen? – jperelli

+1

Ich habe ein dediziertes "sellery.py" Modul, in dem sich die gesamte Sellerie-Konfiguration befindet. Dann wird diese Konfiguration in das andere Modul 'tasks.py' importiert, wo ich alle Aufgaben definiert habe. –

Verwandte Themen