Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将所有芹菜任务的日志消息发送到单个文件_Python_Logging_Celery - Fatal编程技术网

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

Python 将所有芹菜任务的日志消息发送到单个文件,python,logging,celery,Python,Logging,Celery,我想知道如何设置一个更具体的日志系统。我所有的任务都使用 logger = logging.getLogger(__name__) 作为模块范围的记录器 我想让芹菜登录到“celeryd.log”,让我的任务登录到“tasks.log”,但我不知道如何让它工作。使用django芹菜中的CELERYD\u LOG\u文件我可以将所有与CELERYD相关的日志消息路由到CELERYD.LOG,但是没有在我的任务中创建的日志消息的痕迹。注意:这个答案在celery 3.0中已经过时,现在您可以使用它

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

logger = logging.getLogger(__name__)
作为模块范围的记录器

我想让芹菜登录到“celeryd.log”,让我的任务登录到“tasks.log”,但我不知道如何让它工作。使用django芹菜中的
CELERYD\u LOG\u文件
我可以将所有与CELERYD相关的日志消息路由到CELERYD.LOG,但是没有在我的任务中创建的日志消息的痕迹。

注意:这个答案在celery 3.0中已经过时,现在您可以使用它来设置每个任务的日志记录程序。详情请参阅


芹菜有专门的日志记录支持,每个任务。见:

您可以使用worker logger将诊断输出添加到worker日志:

@cellery.task()
def添加(x,y):
logger=add.get_logger()
logger.info(“添加%s+%s”%(x,y))
返回x+y
有几个可用的日志记录级别,由workers日志级别设置决定 是否将它们写入日志文件

当然,您也可以简单地使用print,因为写入standard out/-err的任何内容都可以使用print 也会写入日志文件

在幕后,这仍然是标准的python日志模块。您可以将设置为False以允许自己的日志记录设置工作,否则芹菜将为您配置处理

但是,对于任务,
.get\u 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 
最后但并非最不重要的一点是,您可以在中配置顶级包,并为其提供自己的文件处理程序。我会使用芹菜信号来设置它。在设置任务之后,日志记录程序将信号设置为signals;这里我假设您的所有模块都位于一个名为
foo.tasks
的包中(如
foo.tasks.email
foo.tasks.scaling
):


现在,任何名称以
foo.tasks
开头的记录器都会将其所有消息发送到
tasks.log
,而不是发送到根记录器(根记录器看不到任何这些消息,因为
.propagate
为False)。

只是一个提示:芹菜有自己的日志处理程序:

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
此外,芹菜会记录任务的所有输出。更多详细信息,请访问加入
--concurrency=1--loglevel=INFO
使用命令运行芹菜工人

例如:
python xxxx.py芹菜工人——并发性=1——日志级别=INFO


最好也在每个python文件中设置日志级别

日志消息是缓冲的还是非缓冲的?我想知道无序日志消息是否表示任务执行无序。@EricWalker:
日志记录不缓冲任何内容
FileHandler
使用常规的
open()
调用,默认情况下是以文本模式打开文件,因此写入将使用行缓冲(在每一行换行后刷新,这意味着每个日志条目)。似乎“CELERYD\u HIJACK\u ROOT\u LOGGER”(而不是“CELERY\u HIJACK\u ROOT\u LOGGER”)中有输入错误@艾伯克:我找不到任何关于芹菜、工人、劫机者、根、记录器的参考资料,不知道你在说什么。只有
CELERYD_HIJACK_ROOT_LOGGER
worker_HIJACK_ROOT_LOGGER
配置选项名(后者是前者的4.x小写版本)。@MartijnPieters是的,大约是4.x,您只需在
设置中使用它的前缀和大写字母即可。py
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)