0

目前在我的文件中设置了这个片段,tasks.py以便在huey任务失败时向 Django 项目的管理员发送一封电子邮件:

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

这很漂亮但是......问题:

  1. 现在,只要任务失败(包括重试)就会触发此事件。我希望仅在所有重试失败的情况下发送它。因此,如果一项任务有retries=2,现在我会收到 3 封电子邮件(原始错误 + 2 次重试)。如何让它仅在最后一次重试时发送电子邮件?
  2. 有没有办法打印异常的exc回溯?

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)
4

2 回答 2

1

请参阅:https ://docs.python.org/3.6/library/traceback.html

既然你有任务实例,你应该能够检查是否retries==0.

执行此操作的更标准方法是将日志级别 ERROR 的电子邮件处理程序附加到 Huey 消费者记录器。这就是我会处理它的方式。

于 2020-02-21T16:27:58.623 回答
1

1.我想你可以检查一下task.retries

2. 使用traceback.format_exception

于 2020-02-21T16:32:32.040 回答