gpt4 book ai didi

python - 如何防止从 celery 任务中重复记录异常

转载 作者:太空狗 更新时间:2023-10-30 01:38:12 25 4
gpt4 key购买 nike

第二次编辑:经过一番挖掘后,问题从如何使用局部变量记录异常变为如何防止 celery 发送没有局部变量的第二条日志消息。在下面的尝试之后,我实际上注意到我总是收到 2 封电子邮件,一封有每帧本地变量,另一封没有。

第一次编辑:我设法通过添加自定义 on_failure 覆盖(对所有任务使用 annotations 来获取局部变量,如下所示:

def include_f_locals(self, exc, task_id, args, kwargs, einfo):
import logging
logger = logging.getLogger('celery')
logger.error(exc, exc_info=einfo)

CELERY_ANNOTATIONS = {'*': {'on_failure': include_f_locals}}

但现在的问题是错误出现了 3 次,一次是通过 celery logger,两次是通过 root(尽管我没有在我的日志设置中传播“celery”logger)

原始问题:我有一个 django/celery 项目,我最近在其中添加了一个 Sentry 处理程序作为级别为“错误”的根记录器。这适用于 django 中发生的大多数错误和异常,但来自 celery worker 的错误和异常除外。

发生的情况是,sentry 收到一个异常,其中包含回溯和守护程序的局部变量,但不包括堆栈中每个帧的 f_locals(局部变量)。这些确实出现在正常的 python/django 异常中。

我想我可以 try catch 所有异常并手动使用 exc_info 进行记录。但这并不理想。

最佳答案

有趣的是,当我升级 raven 时,我所有的烦恼都消失了到 5.0 之后的版本(特别是 5.1 之后)。

虽然我不确定哪些更改导致异常被正确记录(with f_locals 正确出现在 Sentry 中),但事实仍然是 raven < 5.0 没有为我工作。

此外,不需要做任何花哨的CELERY_ANNOTATIONS 跑腿工作(如上所述),简单地为正确的记录器定义 Sentry 处理程序似乎足以捕获异常,以及其他日志记录的消息水平。

关于python - 如何防止从 celery 任务中重复记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22954767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com