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

时间:2011-05-31 19:05:01

标签: python logging celery

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

logger = logging.getLogger(__name__)

作为模块范围的记录器。

我希望celery登录到“celeryd.log”并将我的任务记录到“tasks.log”但我不知道如何让它工作。使用来自django-celery的CELERYD_LOG_FILE我可以将所有与celeryd相关的日志消息路由到celeryd.log,但是在我的任务中没有创建日志消息的痕迹。

3 个答案:

答案 0 :(得分:101)

注意:从Celery 3.0开始,此答案已过时,您现在可以使用get_task_logger()来设置每个任务记录器。有关详细信息,请参阅the Logging section of the What's new in Celery 3.0 document


Celery为每项任务提供专门的日志记录支持。请参阅Task documentation on the subject

  

您可以使用workers记录器将诊断输出添加到工作日志中:

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

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

     

当然,您也可以简单地使用print作为标准输出/ -err的任何内容   写入日志文件。

在引擎盖下,这仍然是标准的python日志记录模块。您可以将CELERYD_HIJACK_ROOT_LOGGER option设置为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 logging module中配置顶级软件包,并为其提供自己的文件处理程序。我使用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是{{1}},因此没有看到任何消息假)。

答案 1 :(得分:5)

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

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

此外,Celery记录任务的所有输出。更多详情请见Celery docs for Task Logging

答案 2 :(得分:0)

加入 --concurrency=1 --loglevel=INFO 与运行芹菜工作者的命令

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

更好地在每个python文件中设置日志级别