我正在尝试使用组合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?
感谢您的帮助。
答案 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
希望它有所帮助。