如何防止在这样的应用程序中出现重复的 celery 日志?
# 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
然后我使用 python -c "from test import foo; print foo.delay(4, 4)"
这会导致“来自 foo 的日志信息”同时显示在 celery.log
和 app.log
中。
这是 app.log 内容:
custom_format log info from foo
这里是 celery.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 代码中删除自定义记录器处理程序,但我不想只使用 celery.log,因为它不支持旋转文件。我考虑过使用 --logfile/dev/null
启动 celery,但随后我会丢失未显示在 app.log
中的 mingle 和其他日志。
我可以阻止“来自 foo 的日志信息”出现在 celery.log
中吗?鉴于我是从头开始创建记录器并且只将日志记录设置到 app.log
为什么“来自 foo 的日志信息”无论如何都会出现在 celery.log
中?
是否有可能让 RotatingFileHandler 记录 celery MainProcess 和 Worker 日志(例如 Connected to redis://localhost:6379/0
)(例如进入我的 app .log
)?
最佳答案
Why is "log info from foo" showing up in celery.log?
日志系统基本上是一棵 logging.Logger
对象树,树的根部有主要的 logging.Logger
(你可以通过调用 logging.getLogger()
无参数)。
当您调用 logging.getLogger("child")
时,您将获得对处理“子”日志的 logging.Logger
的引用。问题是当您调用 logging.getLogger("child").info()
时,信息消息会传递给“子”,但也会传递给“子”的父级及其父级,直到它到达根。
要避免将日志发送给父级,您必须设置 logging.getLogger("child").propagate = False
。
关于python - 防止重复的 celery 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45340837/