【问题标题】:Django custom Logger + DjceleryDjango 自定义 Logger + Djcelery
【发布时间】:2012-07-17 06:44:10
【问题描述】:

我正在尝试使用 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 的异步数据传输?

感谢您的帮助。

【问题讨论】:

  • 可能是芹菜从设置中导入一些东西,而日志处理程序是从设置中导入的——循环导入?如果把LogHandler放在settings.py,在tasks.py创建任务,LogHandler会调用这个任务呢?
  • 是的,我这样做了.. LogHandler 调用tasks.py 它仍然必须导入analytics/tasks.py,然后导入celery.task。给出同样的错误。

标签: django celery django-celery amazon-dynamodb


【解决方案1】:

我找到了解决方案。

问题是“如果您的 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 

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2016-11-02
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多