注意:这个答案在 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:
您可以使用工作人员记录器将诊断输出添加到工作人员日志:
@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 为假,根记录器看不到任何这些消息)。