将所有芹菜任务的日志消息发送到一个文件中



我想知道如何设置一个更具体的日志记录系统。我的所有任务都使用

logger = logging.getLogger(__name__)

作为模块范围的记录器。

我想把芹菜记录到"celeryd.log",把我的任务记录到"tasks.log",但我不知道如何让它工作。使用django-celery中的CELERYD_LOG_FILE,我可以将所有与celeryd相关的日志消息路由到celeryd.log,但没有在我的任务中创建的日志消息的踪迹。

注意:这个答案在Celery 3.0中已经过时了,现在您可以使用get_task_logger()来设置每个任务的记录器。有关详细信息,请参阅Celery 3.0文档中的日志记录部分


Celery对每个任务的日志记录都有专门的支持。请参阅任务文档中的主题:

您可以使用worker记录器将诊断输出添加到worker日志:

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

有几个日志记录级别可用,workers日志级别设置决定是否将它们写入日志文件。

当然,您也可以简单地使用print,因为任何写入标准out/-err的东西都将是也写入日志文件。

在后台,这仍然是标准的python日志记录模块。您可以将CELERYD_HIJACK_ROOT_LOGGER选项设置为False,以允许您自己的日志设置工作,否则Celery将为您配置处理。

但是,对于任务,.get_logger()调用允许您为每个任务设置单独的日志文件。只需传入一个logfile参数,它就会将日志消息路由到那个单独的文件:

@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y 

最后但同样重要的是,您可以在python日志记录模块中配置顶级包,并为其提供自己的文件处理程序。我会使用celery.signals.after_setup_task_logger信号来设置;在这里,我假设您的所有模块都位于一个名为foo.tasks的包中(如foo.tasks.emailfoo.tasks.scaling):

from celery.signals import after_setup_task_logger
import logging
def foo_tasks_setup_logging(**kw):
    logger = logging.getLogger('foo.tasks')
    if not logger.handlers:
        handler = logging.FileHandler('tasks.log')
        formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False
after_setup_task_logger.connect(foo_tasks_setup_logging)

现在,任何名称以foo.tasks开头的记录器都会将其所有消息发送到tasks.log,而不是根记录器(因为.propagate为False,所以根记录器看不到任何这些消息)。

只是一个提示:Celery有自己的日志处理程序:

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

此外,Celery会记录任务的所有输出。有关任务日志的更多详细信息,请访问Celery文档

join--concurrency=1 --loglevel=INFO带有运行芹菜工作者的命令

例如:python xxxx.py celery worker --concurrency=1 --loglevel=INFO

最好也在每个python文件中设置日志级别

相关内容

  • 没有找到相关文章

最新更新