IMO 最简单的方法是在创建新的 Celery 应用程序时传递对任务类的引用。
在一个模块中定义默认使用的任务类:
from celery.app.task import Task
import logging
logger=logging.getLogger(__name__)
class LoggingTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
kwargs={}
if logger.isEnabledFor(logging.DEBUG):
kwargs['exc_info']=exc
logger.error('Task % failed to execute', task_id, **kwargs)
super().on_failure(exc, task_id, args, kwargs, einfo)
当您定义您的应用程序时,请引用该模块(注意,它是您提供的字符串引用..):
from celery import Celery
app=Celery('my_project_name', task_cls='task_package.module_name:LoggingTask')
从那时起,如果没有专门提供任务类,则将使用 LoggingTask - 从而允许您影响所有现有任务(使用默认值),而不必修改每个任务。这也意味着您可以正常使用 @shared_task 装饰器。