2

我正在尝试设置 raven 以使用 celery 异步登录到哨兵。我想我已经正确设置了,但是没有调用 CeleryClient 中的 send_raw 函数(并且在哨兵或芹菜中没有任何东西被拾取)。如果我不更改下面的 SENTRY_CLIENT 设置(日志出现在哨兵中),事情就会起作用。我的设置是:

SENTRY_CLIENT = 'raven.contrib.django.celery.CeleryClient'

已安装的应用程序:

'raven.contrib.django',    
# sentry.client.celery should be replaced with raven.contrib.django.celery in INSTALLED_APPS.    
'raven.contrib.django.celery',    

记录:

记录 = {
    “版本”:1,
    'disable_existing_loggers':是的,
    '根': {
        'level': 'WARNING', # 任何警告或以上的东西都会去哨兵...
        'handlers': ['sentry'], # TARAS 这是将所有错误发送到 Sentry 的原因
    },
    “格式化程序”:{
        '详细':{
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
    },
    “处理程序”:{
        “哨兵”:{
            '级别':'错误',
            'class': 'raven.contrib.django.handlers.SentryHandler', # 这是与 Sentry 通信的内容
        },
        '安慰': {
            '级别':'调试',
            '类':'logging.StreamHandler',
            “格式化程序”:“详细”
        }
    },
    “记录器”:{
        'django.db.backends': {
            '级别':'错误',
            '处理程序':['控制台'],
            “传播”:错误,
        },
        '掠夺': {
            '级别':'调试',
            # 类 logging.StreamHandler(stream=None)
            # 返回 StreamHandler 类的新实例。如果指定了流,实例将使用它来记录输出;否则,将使用 sys.stderr。            
            'handlers': ['sentry'], # sentry命中sentry配置如上,console默认按照上面streamhandler的定义命中stderr
            “传播”:错误,
        },
        'sentry.errors':{
            '级别':'调试',
            '处理程序':['控制台'],
            “传播”:错误,
        },
    },
}

我已将 CeleryClient 修改为

CeleryClient 类(CeleryMixin,DjangoClient):
    def send_integrated(self, kwargs):
        self.send_raw_integrated.delay(kwargs)
        打印“哟”

    @task(routing_key='sentry')
    def send_raw_integrated(self, kwargs):
        超级(CeleryClient,self).send_integrated(kwargs)
        打印“yo2”

而且痕迹不出来

4

1 回答 1

2

raven 中的 celery 客户端在任务上使用了路由键:

class CeleryMixin(object):
    def send_encoded(self, *args, **kwargs):
        "Errors through celery"
        self.send_raw.delay(*args, **kwargs)

    @task(routing_key='sentry')
    def send_raw(self, *args, **kwargs):
        return super(CeleryMixin, self).send_encoded(*args, **kwargs)

Django 默认使用直接交换类型:

http://docs.celeryproject.org/en/latest/userguide/routing.html

这意味着(我相信)芹菜产生的消息不会被路由到队列(因此​​永远不会被拾取)。

您可以定义它,例如:

CELERY_QUEUES = {
    "default": {
        "exchange": "default",
        "binding_key": "default"},
    "sentry": {
        "exchange": "default",
        "binding_key": "sentry"},
}
于 2012-07-07T08:10:24.700 回答