【问题标题】:How can I capture all of the python log records generated during the execution of a series of Celery tasks?如何捕获在执行一系列 Celery 任务期间生成的所有 python 日志记录?
【发布时间】:2011-01-04 18:26:11
【问题描述】:

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

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

我想把它分解为三个任务:

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

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

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

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

【问题讨论】:

    标签: python logging message-queue task celery


    【解决方案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 进行存储,它比创建自己的跨进程存储更简单。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        Django Sentry 是 Python(和 Django)的日志记录实用程序,并且支持 Celery。

        【讨论】:

          猜你喜欢
          • 2019-06-15
          • 2020-05-05
          • 2020-08-04
          • 2014-04-14
          • 2018-09-22
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多