您应该使用信号,如下所示:
from celery import signals
@signals.task_failure.connect
def exception_handle(sender, task_id, exception, **kwargs):
if isinstance(exception, redis.exceptions.LockError):
loggert.warning(f"{sender.__qualname__}[{task_id}] can't get lock")
return
loggert.exception(f"{sender.__qualname__}[{task_id}] args={kwargs['args']} kwargs={kwargs['kwargs']} Exception:\n")
@signals.after_setup_logger.connect
def celery_log(logger, **kwargs):
check_console(logger, **kwargs)
@signals.after_setup_task_logger.connect
def task_log(logger, **kwargs):
# todo: add your loggre handle herre...
check_console(logger, **kwargs)
@signals.worker_ready.connect
def clean_lock(**kwargs):
loggert.info('worker_ready')
@signals.worker_init.connect
def hook_prefork(sender, **kwargs):
...
def check_console(logger, format, **kwargs):
if not list(filter(lambda x: type(x) is logging.StreamHandler, logger.handlers)):
console = logging.StreamHandler()
console.setFormatter(logging.Formatter(format))
console.setLevel(logging.INFO)
logger.addHandler(console)