2

セロリを使用して非同期で歩哨にログを記録するようにレイヴンを設定しようとしています。正しく設定したと思いますが、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':True、
    '根': {
        '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'、
            'フォーマッター':'verbose'
        }
    }、
    'ロガー':{
        'django.db.backends':{
            'レベル':'エラー'、
            'ハンドラー':['コンソール']、
            'propagate':False、
        }、
        'カラス': {
            'レベル':'デバッグ'、
            #class logging.StreamHandler(stream = None)
            #StreamHandlerクラスの新しいインスタンスを返します。ストリームが指定されている場合、インスタンスはそれをログ出力に使用します。それ以外の場合は、sys.stderrが使用されます。            
            'handlers':['sentry']、#sentry hits上記のsentry構成、上記のstreamhandlerhitsstderrの定義によるデフォルトのコンソール
            'propagate':False、
        }、
        'sentry.errors':{
            'レベル':'デバッグ'、
            'ハンドラー':['コンソール']、
            'propagate':False、
        }、
    }、
}

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):
        super(CeleryClient、self).send_integrated(kwargs)
        「yo2」を印刷

そして、痕跡は出てこない

4

1 に答える 1

2

レイヴンのセロリクライアントは、タスクでルーティングキーを使用します。

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 に答える