将所有芹菜任务的日志消息发送到单个文件
我想知道如何设置更具体的日志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.email
和foo.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