5

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

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

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 记录器,两次通过 root(尽管我没有在我的日志记录设置中传播“celery”记录器)

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

发生的情况是哨兵接收到一个带有回溯和守护进程本地变量的异常,但不包括f_locals堆栈中每个帧的(本地变量)。这些确实出现在正常的 python/django 异常中。

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

4

1 回答 1

0

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

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

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

于 2014-11-29T07:48:17.433 回答