我想将我自己开发的任务队列系统转换为基于Celery的任务队列,但我目前拥有的一项功能让我感到有些困扰。
现在,我的任务队列操作非常粗糙;我运行该作业(生成数据并将其上传到另一台服务器),使用Nose日志捕获库中的变量收集日志记录,然后将该任务的日志记录存储为应用程序数据库中的详细结果记录。
我想将其分解为三个任务:
这里真正的踢球者是日志记录集合。现在,使用日志捕获,我在数据生成和上载过程中为每个日志调用提供了一系列日志记录。这些是诊断目的所必需的。鉴于任务甚至不能保证在同一个进程中运行,我不清楚如何在Celery任务队列中完成此任务。
我对这个问题的理想解决方案将是一个简单而理想的微创方法,用于在前任任务(1,2)中捕获所有日志记录并使其可用于报告任务(3)
我最好还是保留相当粗糙的任务定义,并将所有这些工作放在一个任务中?或者有没有办法传递现有的捕获日志记录,以便在最后收集它?
答案 0 :(得分:1)
我假设你正在使用logging
模块。您可以为每个任务集使用单独的命名记录器来完成工作。他们将继承上层的所有配置。
task.py
中的:
import logging
@task
step1(*args, **kwargs):
# `key` is some unique identifier common for a piece of data in all steps of processing
logger = logging.getLogger("myapp.tasks.processing.%s"%key)
# ...
logger.info(...) # log something
@task
step2(*args, **kwargs):
logger = logging.getLogger("myapp.tasks.processing.%s"%key)
# ...
logger.info(...) # log something
此处,所有记录都发送到同一个命名记录器。现在,您可以使用2种方法来获取这些记录:
配置文件侦听器,其名称取决于记录器名称。在最后一步之后,只需读取该文件中的所有信息。确保为此侦听器禁用输出缓冲,否则您可能会丢失记录。
创建自定义侦听器,它会在内存中累积记录,然后在被告知时将它们全部返回。我在这里使用memcached进行存储,它比创建自己的跨进程存储更简单。
答案 1 :(得分:0)
听起来某种“观察者”会很理想。如果你可以像流一样观察和使用日志,你可以在结果进入时啜饮结果。由于观察者将单独运行,因此对于它正在观看的内容没有任何依赖性我相信这将满足你对非 - 入侵解决方案。
答案 2 :(得分:0)
Django Sentry是Python(和Django)的日志记录实用程序,并且支持Celery。