问题:
我希望 Celery 捕获异常并将它们写入日志文件,而不是显然吞下它们......
出于专业解决方案的目的,这里当前的最佳答案是马马虎虎。许多 python 开发人员会考虑根据具体情况捕获全面错误是一个危险信号。对此的合理厌恶在评论中得到了很好的阐述:
等一下,我希望工作日志中至少会记录一些失败的任务......
Celery 确实捕获了异常,它只是没有做 OP 希望它用它做的事情(它将它存储在结果后端中)。以下要点是互联网在这个问题上所能提供的最好的。这有点过时了,但请注意分叉和星号的数量。
https://gist.github.com/darklow/c70a8d1147f05be877c3
要点是采用失败案例并对其进行定制。这是 OP 问题的超集。以下是如何调整 gist 中的解决方案以记录异常。
import logging
logger = logging.getLogger('your.desired.logger')
class LogErrorsTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
logger.exception('Celery task failure!!!1', exc_info=exc)
super(LogErrorsTask, self).on_failure(exc, task_id, args, kwargs, einfo)
你仍然需要确保你的所有任务都继承自这个任务类,如果你使用@task
装饰器(使用base=LogErrorsTask
kwarg),要点显示了如何做到这一点。
此解决方案的好处是不会将您的代码嵌套在任何其他 try-except 上下文中。这是在 celery 已经在使用的故障代码路径上的捎带。