我想知道如何设置更具体的日志系统.我的所有任务都使用
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
作为模块范围的记录器.
我希望celery登录到"celeryd.log"并将我的任务记录到"tasks.log",但我不知道如何让它工作.使用CELERYD_LOG_FILE来自django-celery我可以将所有与celeryd相关的日志消息路由到celeryd.log,但是没有在我的任务中创建的日志消息的跟踪.
Mar*_*ers 101
注意:此答案在Celery 3.0中已过时,您现在可以使用它get_task_logger()来设置每个任务记录器.有关详细信息,请参阅Celery 3.0文档中的新功能的"记录"部分.
Celery为每项任务提供专门的日志记录支持.请参阅有关该主题的任务文档:
您可以使用workers记录器将诊断输出添加到工作日志:
Run Code Online (Sandbox Code Playgroud)@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选项设置为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
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的,您可以在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)
Run Code Online (Sandbox Code Playgroud)
现在任何名称以其开头的记录器foo.tasks都会将所有消息发送到tasks.log根记录器(因为它.propagate是False ,所以没有看到任何这些消息).
只是一个提示:Celery有自己的日志记录处理程序:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
Run Code Online (Sandbox Code Playgroud)
此外,Celery记录任务的所有输出.有关任务日志记录的Celery文档的更多详细信息