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

Posted

技术标签:

【中文标题】Celery Logging:在任务内外记录的一致方式【英文标题】:Celery Logging: consistent way to log inside and outside of a task 【发布时间】:2015-08-27 18:59:41 【问题描述】:

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

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")

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

import logging
logger = logging.getLogger(__name__)

def my_func_called_inside_a_task():
    logger.debug("SOME OUTPUT HERE")

如何将这两种方法结合起来,这样我就不必像下面那样做一些多余的事情了?

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")

总结: 如果我从 celery 任务调用该函数,我希望它记录到 celery worker 标准输出。如果我从普通的 Python 提示符调用该函数,它将使用普通的 Python 记录器。任何帮助深表感谢。

【问题讨论】:

Use Python standard logging in Celery 的可能重复项 【参考方案1】:

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

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")

并在你的芹菜任务中将其称为

my_func_called_inside_a_task(use_celery_logger=True)

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

my_func_called_inside_a_task()

【讨论】:

谢谢。我最终使用了这种方法的变体。 我认为 use_celery_logger 会是一个更好的布尔 kwarg 名称,celery_callback 听起来你应该传递一个函数。 @Anentropic 有道理。更新。谢谢。

以上是关于Celery Logging:在任务内外记录的一致方式的主要内容,如果未能解决你的问题,请参考以下文章

将所有 celery 任务的日志消息发送到单个文件

Django Celery 任务日志

django-vuecelery延迟任务定时任务 django中使用celery 秒杀功能 双写一致性 首页轮播图定时更新 课程前端页面

芹菜任务结果不与 rpc 保持一致

celery介绍

celery.utils.log.ProcessAwareLoggerobject 在 logging.Logger.manager.loggerDict 中做啥