如何解决将所有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文件中设置日志级别
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。