如何在这样的应用程序中防止重复的芹菜日志?
# 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.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
开始芹菜,但后来我会松开那些不会出现在app.log
中的混合和其他日志。
我可以阻止"记录来自foo"从celery.log
出现?鉴于我从头开始创建记录器并且只设置记录到app.log
,为什么"记录来自foo"无论如何都出现在celery.log
?
是否可以通过RotatingFileHandler记录芹菜MainProcess和Worker日志(例如Connected to redis://localhost:6379/0
)(例如,进入我的app.log
)?
答案 0 :(得分:7)
为什么“来自foo的日志信息”显示在celery.log中?
日志记录系统基本上是一个logginig.Logger
个对象的树,在树的根中有一个主logging.Logger
(你得到的根调用logging.getLogger()
没有参数。)
当您致电logging.getLogger("child")
时,您会引用处理“子”日志的logging.Logger
。问题是当你调用logging.getLogger("child").info()
时,信息邮件被传递给“孩子”,但也传递给“孩子”的父母及其父母,直到它到达根目录。
为避免向父母发送日志,您必须设置logging.getLogger("child").propagate = False
。