0

DjangoカスタムロガーとCeleryタスクの組み合わせを使用して、特定のアプリケーションログメッセージをキャプチャし、それらをDynamoDBに非同期でダンプしようとしています。ログメッセージを受け取り、それをDynamoDBに非同期で転送するDjangoCeleryタスクを作成しました。カスタムロガーからこのセロリタスクを呼び出して、DynamoDBに非同期で転送しようとしました。

ただし、Djangoカスタムロガーでは次のものをインポートできません。

from celery.task import task, Task, PeriodicTask, periodic_task

私のサーバーは以下のエラーでクラッシュします:

ValueError: Unable to configure handler 'custom_handler': Cannot resolve 'myApp.analytics.tasks.LogHandler': cannot import name cache

カスタムロガーファイルにsettings.pyが含まれている場合、Django Loggerのドキュメントが循環インポートに対して警告することは知っていますが、そうではないことを確認しました。しかし、それでも循環インポートと同じエラーが発生します。

私は何か間違ったことをしていますか、それともDjangoカスタムロガーとDjCeleryを使用してDynamoDBへの非同期データ転送を実現する他の方法がありますか?

助けてくれてありがとう。

4

1 に答える 1

2

私は解決策を見つけました。

問題は、「settings.pyがカスタムハンドラークラスを指定し、そのクラスを定義するファイルがsettings.pyもインポートする場合、循環インポートが発生する」というものでした。

これを解決するには、クラスを定義するファイルではなく、メソッド本体でインポートを実行する必要があります。

これが私のカスタムLogHandlerです:

import logging
#Do not import settings here, as this would lead to circular import.


#This custom log handler parses the message and inserts the entry to the DynamoDB tables.
 class LogHandler(logging.Handler):
   def __init__(self):
    logging.Handler.__init__(self)
    self.report_logger = logging.getLogger('reporting')
    self.report_logger.setLevel(logging.INFO)

   def emit(self, record):
    #Submit the task to "reporting" queue to be picked up and processed by the worker lazily.
    #myApp.analytics.tasks imports celery.task
    from myApp.analytics import tasks
    tasks.push_row_to_dynamodb.apply_async(args=[record])
    return 

それが誰かを助けることを願っています。

于 2012-07-17T14:56:01.813 に答える