我有一个用来运行测试的应用程序/网站。每当我运行测试时,都会创建一个 Celery 任务,并且该任务将经历运行实际测试的过程。测试会联系第三方服务器,因此任务可能失败或挂起的原因有很多。当一切都在本地运行时,这一切都可以正常工作;我可以直接访问stdout
和stderr
- 它们直接在我用来启动 Celery 工人的终端上弹出。如果有错误、挂断或任何其他类似的事情,我可以直接看到它,处理它,并确保将来它得到优雅的处理。
最终,这将托管在独立于我的计算机的服务器上,这就是问题开始的地方:
我想要一种方法来访问特定于任务的日志以stdout
和stderr
(最好是实时)。我实现了 Flower,认为它可能会做到这一点,但似乎没有。我考虑过将日志保存到一个文件中,每个任务一个,并在我的网站上包含一个"查看日志"按钮链接,这将允许我查看我在本地看到的日志——但这非常麻烦。也许我可以做这样的事情:生成指向每个正在运行的任务的链接,并使用javascript更新该链接中的页面/日志文件的内容?
我做了一些研究,并没有发现这种类型的日志记录。有人介意给我指出正确的方向吗?
您可以创建一个 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()