我想知道如何设置更具体的日志记录系统。我的所有任务都使用
logger = logging.getLogger(__name__)
作为模块范围的记录器。
我希望celery登录到“celeryd.log”并将我的任务记录到“tasks.log”但我不知道如何让它工作。使用来自django-celery的CELERYD_LOG_FILE
我可以将所有与celeryd相关的日志消息路由到celeryd.log,但是在我的任务中没有创建日志消息的痕迹。
答案 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.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
是{{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文件中设置日志级别