防止重复芹菜伐木

JDi*_*teo 4 python logging 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")
Run Code Online (Sandbox Code Playgroud)

我启动应用程序: 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.

这是app.log内容:

custom_format log info from foo
Run Code Online (Sandbox Code Playgroud)

这里是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
Run Code Online (Sandbox Code Playgroud)

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

我可以阻止"来自foo的日志信息"出现celery.log吗?鉴于我从头开始创建记录器并且只设置记录到app.log为什么"foo中的日志信息"出现了celery.log

是否有可能Connected to redis://localhost:6379/0通过RotatingFileHandler记录芹菜MainProcess和Worker日志(例如)(例如进入我的app.log)?

Qee*_*eek 7

为什么在celery.log中显示"来自foo的日志信息"?

日志记录系统基本上是一个logginig.Logger对象树,其主要logging.Logger位于树的根中(您可以通过logging.getLogger()不带参数的调用获得根).

当您致电时,logging.getLogger("child")您可以参考logging.Logger处理"子"日志.问题是当您调用logging.getLogger("child").info()信息消息传递给"子"时,也会传递给"子"的父级及其父级,直到它到达根目录.

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