如何防止芹菜任务重复异常记录

时间:2014-04-09 06:43:42

标签: python django celery sentry raven

第二次编辑:经过一番挖掘后,问题从如何使用局部变量记录异常变为如何防止芹菜发送没有本地变量的第二条日志消息。经过以下尝试,我实际上注意到我总是收到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次,一次通过芹菜记录器,两次通过root(虽然我没有在我的记录设置中传播' celery'记录器)

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

发生的事情是,sentry会收到跟踪和守护程序本地的异常,但不包括堆栈中每个帧的f_locals(本地变量)。这些确实出现在普通的python / django异常中。

我想我可以尝试捕获所有异常并手动使用exc_info记录。但这不太理想。

1 个答案:

答案 0 :(得分:0)

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

虽然我不确定哪些更改会导致异常被正确记录( f_locals 正确出现在哨兵中),但事实仍然是raven< 5.0对我不起作用。

此外,没有必要做任何花哨的CELERY_ANNOTATIONS腿部工作(如上所述),只需为正确的记录器定义哨兵处理程序似乎足以捕获异常,以及其他记录级别的消息。 / p>