我想知道如何设置一个更具体的日志记录系统。我的所有任务都使用
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.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
开头的记录器都会将其所有消息发送到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文件中设置日志级别