5

自社開発のタスクキューシステムをCeleryベースのタスクキューに変換したいのですが、現在持っている機能の1つが苦痛を引き起こしています。

現在、私のタスクキューは非常に粗く動作しています。ジョブ(データを生成して別のサーバーにアップロードする)を実行し、Noseのログキャプチャライブラリのバリアントを使用してログを収集してから、タスクのログを詳細な結果レコードとしてアプリケーションデータベースに保存します。

これを3つのタスクに分けたいと思います。

  1. データを収集します
  2. データをアップロードする
  3. 結果のレポート(前の2つのタスクからのすべてのログを含む)

ここでの本当のキッカーは、ロギングコレクションです。現在、ログキャプチャを使用して、データの生成およびアップロードプロセス中に行われたログ呼び出しごとに一連のログレコードがあります。これらは診断目的で必要です。タスクが同じプロセスで実行されることが保証されていないことを考えると、Celeryタスクキューでこれをどのように実行するかは明確ではありません。

この問題に対する私の理想的な解決策は、先行タスク(1、2)中にすべてのログをキャプチャし、レポータータスク(3)で利用できるようにする、些細で理想的には低侵襲の方法です。

タスク定義をかなり粗くして、このすべての作業を1つのタスクにまとめるのが最善ですか?または、最後に収集するために、既存のキャプチャされたログを渡す方法はありますか?

4

3 に答える 3

1

loggingモジュールを使用していると思います。タスクセットごとに個別の名前付きロガーを使用して、ジョブを実行できます。上位レベルからすべての構成を継承します。

task.py:

import logging

@task
step1(*args, **kwargs):
    # `key` is some unique identifier common for a piece of data in all steps of processing
    logger = logging.getLogger("myapp.tasks.processing.%s"%key)
    # ...
    logger.info(...) # log something

@task
step2(*args, **kwargs):
    logger = logging.getLogger("myapp.tasks.processing.%s"%key)
    # ...
    logger.info(...) # log something

ここでは、すべてのレコードが同じ名前のロガーに送信されました。これで、これらのレコードを取得するために 2 つの方法を使用できます。

  1. ロガー名に依存する名前でファイル リスナーを構成します。最後のステップの後、そのファイルからすべての情報を読み取るだけです。このリスナーの出力バッファリングが無効になっていることを確認してください。そうしないと、レコードが失われる危険があります。

  2. レコードをメモリに蓄積し、指示されたときにすべてを返すカスタム リスナーを作成します。ここでは、ストレージに memcached を使用します。独自のクロスプロセス ストレージを作成するよりも簡単です。

于 2011-01-04T10:26:11.967 に答える
0

ある種の「ウォッチャー」が理想的であるように思えます。ログをストリームとして監視して消費できる場合は、結果が入ってくるときに丸呑みすることができます。ウォッチャーは個別に実行されるため、監視しているものに関して依存関係がないため、これは非-侵襲的ソリューション。

于 2010-12-14T14:32:17.123 に答える
0

Django Sentryは、Python (および Django) 用のロギング ユーティリティであり、Celery をサポートしています。

于 2010-12-23T20:24:58.347 に答える