我目前正在基于Django的项目中处理Celery任务。我们已将raven配置为将所有未捕获的异常和日志消息发送到Sentry,如documentation中所述。
一切都很好,除了芹菜任务中未被捕获的异常。例如,如果我运行此任务:
@app.task
def test_logging():
log.error('Testing logging inside a task')
raise IndexError('Testing exception inside a task')
我只在Sentry中看到log.error(...)
而不是IndexError
未捕获的异常。
我已经尝试在try-except
内部使用log.exception(...)
块并且它确实有效,但我认为它不可扩展以捕获所有这样的异常。
所以,问题只是未被捕获的异常,无论如何都得不到妥善处理。
这些是我当前的软件包版本:
celery (3.1.17)
raven (5.1.1)
Django (1.7.1)
你能帮助我朝某个方向前进吗?
谢谢你的时间!
答案 0 :(得分:15)
正如DRC在评论中描述的那样,我们终于使用这种方法得到了解决方案: https://docs.getsentry.com/hosted/clients/python/integrations/celery/
基本上这样做:
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)
感谢您的时间。
答案 1 :(得分:6)
由于使用了问题raven
,因此选择的答案是正确的。
但是,不推荐raven来使用哨兵SDK。
要使用哨兵SDK配置django
和celery
,
首先将sentry-sdk
添加到您的需求文件中。
然后,在您的django设置文件中:
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.celery import CeleryIntegration
sentry_sdk.init(
dsn="your_sentry_DSN",
integrations=[DjangoIntegration(), CeleryIntegration()],
send_default_pii=True
)
来源: