5

2番目の編集:少し掘り下げた後、ローカル変数を使用して例外をログに記録する方法から、セロリがローカル変数を持たない2番目のログメッセージを送信しないようにする方法に質問が変わりました。以下の試行の後、私は常に 2 つのメールを受信して​​いることに実際に気付きました。

最初の編集:カスタムの on_failure オーバーライドを追加することで、ローカル変数を取得することができました (すべてのタスクに次のような注釈を使用します:

def include_f_locals(self, exc, task_id, args, kwargs, einfo):
    import logging
    logger = logging.getLogger('celery')
    logger.error(exc, exc_info=einfo)

CELERY_ANNOTATIONS = {'*': {'on_failure': include_f_locals}}

しかし、現在の問題は、エラーが3回発生することです.1回はセロリロガーを介して、2回はルートを介して発生します(ただし、ログ設定で「セロリ」ロガーを伝播していません)

元の質問: 私は最近、レベル「エラー」のルート ロガーとしてセントリー ハンドラーを追加した django/celery プロジェクトを持っています。これは、セロリワーカーからのものを除いて、django で発生するほとんどのエラーと例外に対して正常に機能します。

何が起こるかというと、セントリーはトレースバックとデーモンのローカルで例外を受け取りますがf_locals、スタック内の各フレームの (ローカル変数) を含みません。そして、これらは通常の python/django 例外に表示されます。

すべての例外をキャッチして、手動で exc_info をログに記録することができると思います。しかし、これは理想的とは言えません。

4

1 に答える 1

0

おもしろいことに、 ravenを 5.0 以降のバージョン (特に 5.1 以降) にアップグレードしただけで、すべての問題が解消されました。

どの変更によって例外が適切にログに記録されたのか (セントリーf_locals正しく表示されたのか) はわかりませんが、raven < 5.0 が機能しなかったという事実は残っています。

また、(上記のような) 複雑な作業を行う必要はありませんCELERY_ANNOTATIONS。適切なロガーに対してセントリー ハンドラーを定義するだけで、例外や他のログ レベルのメッセージをキャッチするのに十分なようです。

于 2014-11-29T07:48:17.433 に答える