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

|| 我想知道如何设置更具体的日志记录系统。我所有的任务都使用
logger = logging.getLogger(__name__)
作为模块范围的记录器。 我希望celery登录到“ celeryd.log”,而我的任务登录到“ tasks.log \”,但是我不知道如何使它工作。使用django-celery中的
CELERYD_LOG_FILE
,可以将所有与celeryd相关的日志消息路由到celeryd.log,但是没有跟踪在我的任务中创建的日志消息。     
已邀请:
        注意:此答案从Celery 3.0开始已经过时,在此您现在使用
get_task_logger()
来设置每个任务记录器。有关详细信息,请参见“ Celery 3.0的新增功能”的“日志记录”部分。 Celery为每个任务提供了专门的日志记录支持。请参阅有关此主题的任务文档:   您可以使用工作日志记录器将诊断输出添加到工作日志:      
@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info(\"Adding %s + %s\" % (x, y))
    return x + y
     有多个日志记录级别可用,并且工作程序日志级别设置决定   是否将它们写入日志文件。      当然,您也可以简单地使用print,因为任何写入标准out / -err的内容都会   也写入日志文件。 在后台,这仍然是标准的python日志记录模块。您可以将“ 4”选项设置为“ 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
和package11ѭ):
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)
现在,任何名称以ѭ9开头的记录器都会将其所有消息发送到
tasks.log
,而不是发送到根记录器(由于
.propagate
为False,因此看不到任何这些消息)。     
        只是一个提示:Celery有自己的日志记录处理程序:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
同样,Celery记录任务的所有输出。 Celery docs上有关任务记录的更多详细信息     
        加入
--concurrency=1 --loglevel=INFO
与命令来运行芹菜工人 例如:
python xxxx.py celery worker --concurrency=1 --loglevel=INFO
更好地也在每个python文件中设置日志级别     

要回复问题请先登录注册