gpt4 book ai didi

python - 如何以编程方式告诉 Celery 将所有日志消息发送到 stdout 或 stderr?

转载 作者:太空狗 更新时间:2023-10-29 21:07:20 25 4
gpt4 key购买 nike

如何以编程方式打开 celery 日志记录?

从终端,这工作正常:

celery worker -l DEBUG

当我调用 get_task_logger(__name__).debug('hello') 时,我可以在终端中看到消息。 (正在显示 stdout 和 stderr)我什至可以 import logging 并调用 logger.info('hi') 并查看它。 (两者都有效)

但是,在开发任务时,我更喜欢使用测试模块并直接调用任务函数,而不是启动整个 worker。但是我看不到日志消息。我知道 Celery 正在将所有内容重定向到其内部设备,但我也想在 stdout 上查看日志消息。

我如何告诉 Celery 将日志消息的副本发送回标准输出?

我已经阅读了很多关于日志记录的在线文章,但似乎 celery 中许多与日志记录相关的配置变量已被弃用,我不清楚文档中今天支持的路径是什么。

这是一个创建 celery 对象并尝试记录输出的示例模块。终端中没有任何显示。

示例 mymodule.py

from celery import Celery
import logging
from celery.utils.log import get_task_logger

app = Celery('test')
app.config_from_object('myfile', True)

get_task_logger(__name__).warn('hello world')
logging.getLogger(__name__).warn('hello world 2')

编辑我知道我可以添加一个处理程序,通过添加一个处理程序将一些输出重定向回终端

log = get_task_logger(__name__)
h = logging.StreamHandler(sys.stdout)
log.addHandler(h)

但是有没有一种“ celery 方式”可以做到这一点?也许可以让我也拥有 Celery 格式的文本行。

[2014-03-02 15:51:32,949: WARNING] hello world

最佳答案

我一直在看同样的问题...

根据 http://docs.celeryproject.org/en/latest/userguide/signals.html#after-setup-logger,似乎最好的方法是使用信号处理程序

在你的 celery.py 文件中使用:

from celery.signals import after_setup_logger
import logging


@after_setup_logger.connect()
def logger_setup_handler(logger, **kwargs ):
my_handler = MyLogHandler()
my_handler.setLevel(logging.DEBUG)
my_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #custom formatter
my_handler.setFormatter(my_formatter)
logger.addHandler(my_handler)

logging.info("My log handler connected -> Global Logging")


if __name__ == '__main__':
app.start()

然后您可以根据需要定义MyLogHandler()

要将日志发送到 STDOUT,您还应该能够使用(我还没有测试过):

my_handler = logging.StreamHandler(sys.stdout)

关于python - 如何以编程方式告诉 Celery 将所有日志消息发送到 stdout 或 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22146815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com