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

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

logger = logging.getLogger(__name__) 

作为模块范围的logging器。

我想芹菜login到“celeryd.log”和我的任务“tasks.log”,但我不知道如何得到这个工作。 使用django-celery中的CELERYD_LOG_FILE我可以将所有芹菜相关的日志消息路由到celeryd.log,但没有任何在我的任务中创build的日志消息的跟踪。

注意:这个答案已经过时了,现在你使用get_task_logger()来设置你的每个任务的logging器。 有关详细信息,请参阅“Celery 3.0文档中的新增内容”的“日志logging”部分 。


芹菜有专门的支持logging,每个任务。 请参阅有关该主题的任务文档 :

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

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

有几个可用的日志logging级别,并且工作者日志级别设置决定是否将它们写入日志文件。

当然,您也可以简单地使用print,因为写入标准out / -err的任何内容都会被写入到日志文件中。

在引擎盖下,这仍然是标准的Python日志logging模块。 您可以将CELERYD_HIJACK_ROOT_LOGGER选项设置为False以允许您自己的日志logging设置工作,否则Celery将为您configuration处理。

但是,对于任务, .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日志模块中configuration你的顶级包,并给它一个自己的文件处理程序。 我会使用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开头的logging器都会将所有消息发送到tasks.log而不是logging到根logging器(因为.propagate为False,所以没有看到任何这些消息)。

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

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

另外,Celerylogging任务的所有输出。 在芹菜更详细的文档为任务logging