Вызов команды управления Django из задачи Celery и перенаправление журналов

Я пытаюсь вызвать команду управления с помощью call_command внутри задачи Celery. Команда управления пишет журналы различными способами: через операторы печати, self.stdout.write или используя логгер, определенный на уровне модуля сценария.

Я хочу захватить все эти сообщения журнала в Celery logger, чтобы сделать их видимыми в Datadog. Возможно ли это?

Я попробовал вариант worker_redirect_stdouts_level, но он влияет на глобальную конфигурацию протоколирования Celery.

You can use call_command() with StringIO to capture stdout within a Celery task and redirect it to the Celery logger

from celery import shared_task
from django.core.management import call_command
import io
import logging

logger = logging.getLogger(__name__)

@shared_task
def task_that_runs_your_management_command():
    output = io.StringIO()  # To capture stdout
    
    try:
        call_command("your_command", stdout=output, stderr=output)
    except Exception as e:
        logger.exception("Error while executing management command")

    # Log the captured output
    command_output = output.getvalue()
    if command_output:
        logger.info("Management Command Output:\n%s", command_output)
Вернуться на верх