将所有celery任务的日志消息发送到单个文件

64 python logging celery

我想知道如何设置更具体的日志系统.我的所有任务都使用

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记录器将诊断输出添加到工作日志:

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y
Run Code Online (Sandbox Code Playgroud)

有几个可用的日志记录级别,而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.emailfoo.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 ,所以没有看到任何这些消息).


kol*_*pto 6

只是一个提示:Celery有自己的日志记录处理程序:

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
Run Code Online (Sandbox Code Playgroud)

此外,Celery记录任务的所有输出.有关任务日志记录的Celery文档的更多详细信息