Вызов команды управления 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)