代码之家  ›  专栏  ›  技术社区  ›  Chris R

如何捕获在执行一系列芹菜任务期间生成的所有python日志记录?

  •  5
  • Chris R  · 技术社区  · 15 年前

    我想把我自己开发的任务队列系统转换成一个基于芹菜的任务队列,但我目前拥有的一个功能让我有些苦恼。

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

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

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

    真正的关键是伐木收集。现在,使用日志捕获,我对数据生成和上载过程中的每个日志调用都有一系列日志记录。这些是诊断所必需的。考虑到任务甚至不能保证在同一个进程中运行,所以不清楚如何在芹菜任务队列中完成此任务。

    我对这个问题的理想解决方案将是一种简单且理想的微创方法,它可以在前一个任务(1,2)期间捕获所有日志,并将其提供给报告者任务(3)。

    我最好还是保持任务定义的粗粒度,并将所有这些工作放在一个任务中?或者有没有一种方法可以通过现有的捕获日志来在最后收集它?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Alexander Lebedev    15 年前

    我想你在用 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
    

    在这里,所有记录都被发送到同一个命名的记录器。现在,您可以使用两种方法来获取这些记录:

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

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

        2
  •  0
  •   Lloyd Moore    15 年前

    听起来像是某种“观察者”比较理想。如果你能将日志作为一个流来观察和使用,你就可以在结果传入时将其拖入。由于监视程序将单独运行,因此与它所监视的内容没有依赖关系,我相信这将满足您对非侵入性解决方案的要求。

        3
  •  0
  •   Brendon Crawford    15 年前

    Django Sentry 是一个python(和django)的日志工具,并且支持芹菜。

    推荐文章