【问题标题】:A a means of viewing task-specific logs via Flower (or some other similar interface)一种通过 Flower(或其他类似界面)查看特定任务日志的方法
【发布时间】:2019-08-19 18:23:57
【问题描述】:

我有一个用于运行测试的应用程序/网站。每当我运行测试时,都会创建一个 Celery 任务,并且该任务会经历运行实际测试的过程。测试会联系第 3 方服务器,因此任务可能失败或挂起的原因有很多。当一切都在本地运行时,这一切都很好;我可以直接访问stdoutstderr——它们会直接出现在我用来启动 Celery 工人的终端上。如果出现错误、挂断或任何其他类似情况,我可以直接看到并处理它,并确保它在未来得到妥善处理。

最终,这将托管在独立于我的计算机的服务器上,这就是问题开始的地方:

我想要一种方法来访问特定于任务的日志到 stdoutstderr(最好是实时的)。我实现了Flower,认为它可能会这样做,但似乎没有。我曾考虑将日志保存到一个文件中,每个任务一个文件,并在我的网站上包含一个“查看日志”按钮链接,这样我就可以看到我在本地看到的日志——但这很麻烦。也许我可以这样做:为每个正在运行的任务生成一个链接,并使用 javascript 更新该链接中的页面以及日志文件的内容?

我进行了一些研究,并没有发现太多这种类型的日志记录方式。有人介意给我指出正确的方向吗?

【问题讨论】:

    标签: django logging celery django-celery flower


    【解决方案1】:

    您可以创建一个 LoggingTask 对象来捕获日志并将它们作为任务的结果发布(如果您没有使用结果)。

    我没有对此进行测试,但它应该适用于一些柚木(你应该注意它也会吃掉例外):

    import logging
    from io import StringIO
    from celery import Task
    
    LOGGER = logging.getLogger(__name__)
    
    class LoggingTask(Task):
        def __call__(self, *args, **kwargs):
            # Only handles the logging capture
            log_stream = StringIO()
            handler = logging.StreamHandler(log_stream)
            try:
                logging.getLogger().addHandler(handler)
                Task.__call__(self, *args, **kwargs)
            catch:
                LOGGER.exception("Error in task")
            finally:
                logging.getLogger().removeHandler(handler)
    
            handler.flush()
    
            return log_stream.getvalue()
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2012-05-23
      • 2011-10-23
      相关资源
      最近更新 更多