Huey任务队列句柄仅在上次重试时出错&检索异常回溯

2024-04-28 20:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,在mytasks.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回溯

另外,我尝试通过Django项目日志设置它,但是这种方法提供了更细粒度的控制,所以我对它很满意

更新

基于@Adam Chainz&;的模块更新@科利弗的答案(都是正确的)现在看起来像:

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)

Tags: djangofromimportmessagetasksignal电子邮件mail
2条回答

一号。我想你可以查一查task.retries

二号。使用traceback.format_exception

见:https://docs.python.org/3.6/library/traceback.html

既然您有任务实例,您应该能够检查retries==0

一种更标准的方法是将日志级别错误的电子邮件处理程序附加到huey consumer logger。这就是我处理这件事的方式

相关问题 更多 >