В настоящее время этот фрагмент настроен в моем tasks.py
, так что электронное письмо отправляется Django администраторам huey
при сбое задачи:
from django.core.mail import mail_admins
from huey import signals
from huey.contrib import djhuey as huey
@huey.signal(signals.SIGNAL_ERROR)
def task_error(signal, task, exc):
subject = f'Task [{task.name}] failed
message = f"""Task ID: {task.id}'
Args: {task.args}
Kwargs: {task.kwargs}
Exception: {exc}"""
mail_admins(subject, message)
Это приводит к следующему (пример) тема письма
[Django] Task [test_task] failed
и тело:
Task ID: 89e4bfb3-3cd3-4d6f-8693-68874caf21ec
Args: (123,)
Kwargs: {}
Exception: division by zero
, что довольно гладко, но ... вопросы:
- Сейчас это срабатывает при сбое задачи, включая повторные попытки. Я хотел бы, чтобы он был отправлен только в случае, если все попытки не пройдены. Так что, если задача имеет
retries=2
, сейчас я получаю 3 электронных письма (исходная ошибка + 2 попытки). Как сделать так, чтобы сообщение отправлялось только при последней попытке? - Есть ли способ напечатать
exc
traceback исключения?
PS Я попытался настроить его с помощью Django ведение журнала проекта, но этот подход предлагает более детальное управление, поэтому я доволен им.
Обновление
Модуль с обновлениями, основанный на ответах @Adam Chainz & @ coleifer (оба правильные ), теперь выглядит так:
import traceback
from django.core.mail import mail_admins
from huey import signals
from huey.contrib import djhuey as huey
@huey.signal(signals.SIGNAL_ERROR)
def task_error(signal, task, exc):
if task.retries > 0:
return
subject = f'Task [{task.name}] failed'
message = f"""Task ID: {task.id}
Args: {task.args}
Kwargs: {task.kwargs}
Exception: {exc}
{traceback.format_exc()}"""
mail_admins(subject, message)