python - 防止重复的 celery 记录

标签 python logging celery

如何防止在这样的应用程序中出现重复的 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

这会导致“来自 foo 的日志信息”同时显示在 celery.logapp.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/

相关文章:

python - 如何在我的 GAE 数据存储上实现搜索 API?

python - 在实现二叉搜索树时,Python 中的最大递归深度超出了错误

python - 如何使 Python Structlog 在不使用关键字 `event` 的情况下进行记录

django - 在 heroku 上运行 celery 的最佳实践

postgresql - Docker-compose:将 Celery 绑定(bind)到 Postgres 数据库

python - PyOpenGL深度测试没有做任何事情

python - 从 pandas 数据框转换为 LabeledPoint RDD

SQL 用于数据记录?

.net - NLog 规则排序

django - 从一条线上处决两名 celery worker