防止重复的芹菜伐木



如何防止此类应用程序中出现重复的芹菜日志?

# test.py
from celery import Celery
import logging
app = Celery('tasks', broker='redis://localhost:6379/0')
app.logger = logging.getLogger("new_logger")
file_handler = logging.handlers.RotatingFileHandler("app.log", maxBytes=1024*1024, backupCount=1)
file_handler.setFormatter(logging.Formatter('custom_format %(message)s'))
app.logger.addHandler(file_handler)
@app.task
def foo(x, y):
app.logger.info("log info from foo")

我从以下方面开始应用程序:celery -A test worker --loglevel=info --logfile celery.log

然后我让 foo 运行python -c "from test import foo; print foo.delay(4, 4)"

这导致"来自 foo 的日志信息"同时显示在celery.logapp.log中。

这是应用程序.log内容:

custom_format log info from foo

这是芹菜.log内容:

[2017-07-26 21:17:24,962: INFO/MainProcess] Connected to redis://localhost:6379/0
[2017-07-26 21:17:24,967: INFO/MainProcess] mingle: searching for neighbors
[2017-07-26 21:17:25,979: INFO/MainProcess] mingle: all alone
[2017-07-26 21:17:25,991: INFO/MainProcess] celery@jd-t430 ready.
[2017-07-26 21:17:38,224: INFO/MainProcess] Received task: test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162]  
[2017-07-26 21:17:38,225: INFO/ForkPoolWorker-4] log info from foo
[2017-07-26 21:17:38,226: INFO/ForkPoolWorker-4] Task test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162] succeeded in 0.000783085000876s: None

我考虑过从 python 代码中删除自定义记录器处理程序,但我不想只使用芹菜.log因为它不支持旋转文件。 我考虑过用--logfile /dev/null开始芹菜,但后来我会失去混合和其他没有出现在app.log中的日志。

我可以防止"来自foo的日志信息"显示在celery.log中吗? 鉴于我从头开始创建了记录器并且只设置日志记录以app.log为什么"来自 foo 的日志信息"无论如何都会显示在celery.log中?

是否可以获取芹菜主进程和工作线程日志(例如Connected to redis://localhost:6379/0( 由旋转文件处理程序记录(例如进入我的app.log(?

为什么"来自 foo 的日志信息"出现在芹菜.log中?

日志记录系统基本上是一个由logging.Logger对象的树,主logging.Logger在树的根中(你可以通过调用logging.getLogger()获得根,没有参数(。

调用logging.getLogger("child")时,您将获得对处理"子"日志logging.Logger的引用。问题是当您调用logging.getLogger("child").info()信息消息传递到"子"时,也会传递到"子"的父级及其父级,直到它到达根目录。

为避免将日志发送给父级,您必须设置logging.getLogger("child").propagate = False

相关内容

  • 没有找到相关文章

最新更新