1

モジュール(ライブラリのイベントではなく)からのDEBUG(およびそれ以上)のイベントを(コンソールに)ログに記録するようにdjango celeryを取得しようとしています。したがって、セロリドを次のように開始します。

python hack/manage.py celeryd -E -l DEBUG -c 2

すべての DEBUG イベントがコンソール (ルート ロガーのハンドラー) に渡されることを意味します。この動作を次のように変更したいと思います。

  • mymodule (および子モジュール) からの DEBUG イベントがコンソールに移動します
  • 他のすべてのモジュールからの DEBUG イベントは無視されます (例: Null Handler に移動します)。
  • 他のすべてのイベントは通常どおり処理されます (例: ERROR は引き続きメール ハンドラに送信されます)。

これを行う最善の方法は何ですか?

4

1 に答える 1

4

私はこれに苦労しましたが、これを行うための「最善の」方法は1つもありません。いくつかのことを覚えておくことが重要です。

  • Celery は、別の実行可能ファイルとして本番環境で実行されます。これは明らかなように思えますが、ログ ファイルを他のもの (django など) と共有するとうまくいかないことを意味します ( CELERYD_HIJACK_ROOT_LOGGERを参照)。
  • 実稼働環境と開発環境の両方で同様の方法で物事を実行し続けることは非常に重要です。そのため、実稼働環境に移行したときに問題が発生することはありません ( CELERY_ALWAYS_EAGERを参照して使用してください) 。
  • 設定を使用する場合、manage.py から実行すると、Celery はsettings.py設定のためにファイルを参照します。

それを念頭に置いて、ニーズに合わせてロギングを設定することをお勧めします。まず、モジュールのログ レベルが適切に設定されていることを確認します。ロギングの設定方法については、私の他の投稿を参照してください。ここにあなたのニーズを満たすための要約版があります

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            '()': 'logutils.colorize.ColorizingStreamHandler',
            'formatter': 'standard',
            'stream': sys.stdout
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        },

    },
    'loggers': {
        'django': {
            'handlers': ['mail_admins'],
            'propagate': True,
            'level': 'ERROR',
        },
        'mymodule': {
            'handlers': ['console', 'mail_admins'],
            'propagate': True,
            'level': 'DEBUG'

        },
    }
}

次に、このように実行します。

./manage.py celeryd --event --beat --settings=dev

これが行うことは、2 つの異なるハンドラーを設定することです。1 つ目は、DEBUG 以上のものを報告するコンソール ハンドラです。2 つ目は、ERRORS 以上のみを調べるメール ハンドラです。次は、ロガーから報告される内容です。すべての django.* ロガーは、ERROR レベルのハンドラー (mail_admins) に報告されます。そして、私たちのモジュールはいずれもプッシュ DEBUG 以上を両方に取得します。

これがあなたが求めているものだと思います。

于 2013-05-26T18:43:42.807 に答える