Django自定义Logger + Djcelery

时间:2012-07-17 06:44:10

标签: django celery django-celery amazon-dynamodb

我正在尝试使用组合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

我知道如果自定义记录器文件,Django Logger docs会警告循环导入 包括settings.py但我已经确定不是这样的。但它仍然给我与圆形进口相同的错误。

我做错了什么或者是否有其他方法可以使用Django自定义记录器和DjCelery实现异步数据传输到DynamoDB?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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 

希望它有所帮助。