python - 如何捕获一系列 Celery 任务执行过程中产生的所有 python 日志记录?

标签 python logging message-queue task celery

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

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

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

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

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

我对这个问题的理想解决方案将是一种简单且理想情况下侵入性最小的方法,用于捕获前置任务 (1、2) 期间的所有日志记录,并将其提供给报告者任务 (3)

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

最佳答案

我假设您正在使用 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 进行存储,这比创建您自己的跨进程存储更简单。

关于python - 如何捕获一系列 Celery 任务执行过程中产生的所有 python 日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4158758/

相关文章:

python - Networkx:使用公共(public)函数进行边权重计算

java - MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL

linux - 如何使用给定模式 tail -f 最新日志文件

c# - Rabbitmq Ack 或 Nack,将消息留在队列中

python - 关于在 Python 中关闭文件

python - 如果对象也有其他类,Beautiful Soup 也找不到 CSS 类

javascript - 如何在发布新消息之前删除rabbitmq中的特定消息?

linux - msgsnd() 是线程和/或进程安全的吗?

Python 从字符串中删除嵌套的 unicode 'u' 符号

javascript - 单击使用 JavaScript 记录