一种通过Flower(或其他类似界面)查看特定于任务的日志的方法

时间:2019-03-28 21:01:10

标签: django logging celery django-celery flower

我有一个用于运行测试的应用程序/网站。每当我运行测试时,都会创建一个Celery任务,并且此任务会经过运行实际测试的过程。该测试与第三方服务器联系,因此有很多原因可能导致任务失败或挂起。当一切都在本地运行时,这一切都很好。我可以直接访问class Program { static async Task Main(string[] args) { var uri = new Uri(" http://webdavserver.net/User7bb0de4/" ); var payload = "content"; await MakeRequest(uri, payload); await MakeRequest(uri, payload); } private static async System.Threading.Tasks.Task MakeRequest(Uri uri, string payload) { var firstRequest = WebRequest.Create(uri) as HttpWebRequest; firstRequest.Method = "PROPFIND"; // PUT works OK. LOCK, PROPFIND, MKCOL - not using (var stream = await firstRequest.GetRequestStreamAsync()) using (var textWriter = new StreamWriter(stream, System.Text.Encoding.UTF8)) { await textWriter.WriteAsync(payload.ToLower()); } } } stdout-它们会在我用来启动Celery的工作人员的终端上弹出。如果有错误,挂断或任何其他此类问题,我可以直接看到它,进行处理,并确保将来能够妥善处理。

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以创建一个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()