Celery Logging:记录任务内部和外部的一致方式

Joe*_*e J 5 python django logging task celery

我正在运行一个执行函数的Celery任务.此函数生成一些日志记录信息.使用get_task_logger记录器,我可以将记录信息打印到Celery stdout.

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")
Run Code Online (Sandbox Code Playgroud)

但是,我还想将此函数导入为普通的python脚本(不使用Celery)并登录到例如stdout.通常,我可能会做以下事情:

import logging
logger = logging.getLogger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")
Run Code Online (Sandbox Code Playgroud)

如何将这两种方法结合起来,以便我不必像以下那样做多余的事情?

import logging
from celery.utils.log import get_task_logger
logger = logging.getLogger(__name__)
logger_celery = get_task_logger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")
    logger_celery.debug("SOME OUTPUT HERE")
Run Code Online (Sandbox Code Playgroud)

简介:如果我从celery任务调用该函数,我希望它能够登录到芹菜工作者stdout.如果我从普通的Python提示符调用该函数,它将使用普通的Python记录器.任何帮助深表感谢.

Chi*_*and 5

您可以将可选参数传递给该函数.

import logging
from celery.utils.log import get_task_logger


def my_func_called_inside_a_task(use_celery_logger=None):
    if use_celery_logger:
        logger = get_task_logger(__name__)
    else:
        logger = logging.getLogger(__name__)

    logger.debug("SOME OUTPUT HERE")
Run Code Online (Sandbox Code Playgroud)

在你的芹菜任务中称之为

my_func_called_inside_a_task(use_celery_logger=True)
Run Code Online (Sandbox Code Playgroud)

对于正常的日志记录,您可以按原样调用它

my_func_called_inside_a_task()
Run Code Online (Sandbox Code Playgroud)

  • 我认为“use_celery_logger”对于布尔 kwarg 来说是一个更好的名称,“celery_callback”听起来你应该传递一个函数。 (2认同)