5

我想将我自己开发的任务队列系统转换为基于 Celery 的任务队列,但我目前拥有的一项功能让我有些苦恼。

现在,我的任务队列操作非常粗糙;我运行作业(生成数据并将其上传到另一台服务器),使用 Nose 日志捕获库的变体收集日志记录,然后将任务的日志记录作为详细结果记录存储在应用程序数据库中。

我想将其分解为三个任务:

  1. 收集数据
  2. 上传数据
  3. 报告结果(包括前两个任务的所有日志记录)

这里真正的关键是日志收集。现在,使用日志捕获,我对在数据生成和上传过程中进行的每个日志调用都有一系列日志记录。这些是诊断目的所必需的。鉴于任务甚至不能保证在同一个进程中运行,尚不清楚我将如何在 Celery 任务队列中完成此任务。

我对这个问题的理想解决方案将是一种微不足道且理想的微创方法,用于在前任任务 (1、2) 期间捕获所有日志记录并使其可用于报告任务 (3)

我是否最好保持对我的任务定义的粗粒度,并将所有这些工作放在一个任务中?或者有没有办法传递现有的捕获日志以便在最后收集它?

4

3 回答 3

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 种方法来获取这些记录:

  1. 使用取决于记录器名称的名称配置文件侦听器。在最后一步之后,只需从该文件中读取所有信息。确保为此侦听器禁用输出缓冲,否则您可能会丢失记录。

  2. 创建自定义侦听器,该侦听器将在内存中累积记录,然后在被告知时将它们全部返回。我会在这里使用 memcached 进行存储,它比创建自己的跨进程存储更简单。

于 2011-01-04T10:26:11.967 回答
0

Django Sentry是 Python(和 Django)的日志工具,并且支持 Celery。

于 2010-12-23T20:24:58.347 回答
0

听起来某种“观察者”是理想的。如果您可以将日志作为流观看和使用,您可以在结果进入时对结果进行啜饮。由于观察者将单独运行,因此对其正在观看的内容没有依赖性,我相信这将满足您对非-侵入性解决方案。

于 2010-12-14T14:32:17.123 回答