web-dev-qa-db-ja.com

すべてのセロリタスクからのログメッセージを単一のファイルに送信する

もっと具体的なログシステムをセットアップする方法を知りたいです。私のすべてのタスクは

logger = logging.getLogger(__name__)

モジュール全体のロガーとして。

セロリが「celeryd.log」にログを記録し、タスクを「tasks.log」に記録したいのですが、これをどのように機能させるかわかりません。 Django-celeryのCELERYD_LOG_FILEを使用すると、すべてのceleryd関連のログメッセージをceleryd.logにルーティングできますが、タスクで作成されたログメッセージのトレースはありません。

64
user816328

注:この回答はCelery 3.0の時点では時代遅れであり、現在では get_task_logger() を使用してタスクごとのロガーをセットアップしています。詳細については、 Celery 3.0ドキュメントの新機能のロギングセクション を参照してください。


Celeryは、タスクごとにロギングの専用サポートを提供しています。 テーマに関するタスクドキュメント を参照してください。

ワーカーロガーを使用して、ワーカーログに診断出力を追加できます。

_@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y
_

使用可能なログレベルはいくつかあり、ワーカーのログレベル設定は、ログファイルに書き込むかどうかを決定します。

もちろん、標準のout/-errに書き込まれたものはすべてログファイルにも書き込まれるため、単にprintを使用することもできます。

内部では、これはすべて標準のpythonロギングモジュールです。 _CELERYD_Hijack_ROOT_LOGGER_オプション をFalseに設定して、独自のロギングセットアップを機能させることができます。それ以外の場合、Celeryが処理を構成します。

ただし、タスクの場合、.get_logger()呼び出しを使用すると、個々のタスクごとに個別のログファイルを設定できます。単にlogfile引数を渡すと、ログメッセージがその別のファイルにルーティングされます。

_@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y 
_

最後になりましたが、トップレベルパッケージを python logging module で設定し、独自のファイルハンドラーを与えることができます。 _celery.signals.after_setup_task_logger_信号を使用してこれをセットアップしました。ここでは、すべてのモジュールが_foo.tasks_(_foo.tasks.email_および_foo.tasks.scaling_)と呼ばれるパッケージにあると仮定します。

_from celery.signals import after_setup_task_logger
import logging

def foo_tasks_setup_logging(**kw):
    logger = logging.getLogger('foo.tasks')
    if not logger.handlers:
        handler = logging.FileHandler('tasks.log')
        formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False

after_setup_task_logger.connect(foo_tasks_setup_logging)
_

これで、名前が_foo.tasks_で始まるロガーのすべてのメッセージは、ルートロガーではなく_tasks.log_に送信されます(_.propagate_がFalseであるため、これらのメッセージは表示されません)。

101
Martijn Pieters

ヒント:Celeryには独自のロギングハンドラがあります。

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

また、Celeryはタスクからのすべての出力をログに記録します。詳細は タスクロギングのCeleryドキュメント

5
kolypto