0

我正在尝试使用 Django 自定义记录器和 Celery 任务的组合来捕获某些应用程序日志消息并将它们异步转储到 DynamoDB 中。我创建了一个 Django Celery 任务,它接收一条日志消息并将其异步传输到 DynamoDB。我试图从我的自定义记录器中调用这个 celery 任务,以将其异步传输到 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 回答