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 をログに記録することができると思います。しかし、これは理想的とは言えません。