Что использовали для логгирования ошибок в Celery?
Что проверяют
Эксплуатировали ли вы Celery в проде. В воркере логирование ведёт себя не так, как в веб-процессе, и человек, который только запускал задачи локально, об этом обычно не знает. По ответу видно, разбирали ли вы падения задач по-настоящему.
Как отвечать
Разложите ответ по слоям. Внутри задачи берите логгер не напрямую, а через celery: он подмешивает в записи имя задачи и её идентификатор, по которому потом собирается вся история попыток.
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
@app.task(bind=True, autoretry_for=(ConnectionError,), retry_backoff=True, max_retries=5)
def send_order(self, order_id):
logger.info("отправляю заказ %s, попытка %s", order_id, self.request.retries)Настройка: по умолчанию воркер перехватывает корневой логгер, и своя конфигурация может не примениться. Перехват выключается настройкой worker_hijack_root_logger, после чего логирование задаётся своим словарём конфигурации, а сигналы setup_logging и after_setup_task_logger дают точку, где это сделать.
Падения: непойманное исключение попадает в лог воркера с трассировкой, но узнавать об ошибке из логов поздно. Поэтому сверху ставят трекер ошибок с интеграцией для Celery, а для своей логики есть on_failure у базового класса задачи и сигнал task_failure.
Доставка: пишите структурированные строки в stdout, сбором занимается инфраструктура. Файл внутри контейнера с несколькими воркерами это перемешанные строки и потери при перезапуске.
Где спотыкаются
Ставят print и настраивают логирование прямо в модуле с задачами. Из-за перехвата корневого логгера записи либо пропадают, либо задваиваются, и человек делает вывод, что Celery «глотает логи».
Второе: считают, что упавшая задача обязательно заметна. Воркер, убитый по нехватке памяти, уносит её молча, если подтверждение брокеру выдаётся до выполнения. Нужны поздние подтверждения, предел числа попыток и алерт на очередь повторов.
Третье: логируют входной объект целиком. В задачах ездят персональные данные и токены, и они оседают в хранилище логов надолго.