如何以编程方式告诉 Celery 将所有日志消息发送到标准输出或标准错误?

Posted

技术标签:

【中文标题】如何以编程方式告诉 Celery 将所有日志消息发送到标准输出或标准错误?【英文标题】:How to programmatically tell Celery to send all log messages to stdout or stderr? 【发布时间】:2014-04-04 12:06:04 【问题描述】:

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

从终端,这工作正常:

celery worker -l DEBUG

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

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

如何告诉 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)

但是有没有“芹菜方式”来做到这一点?也许一个让我也有芹菜格式的文本行。

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

【问题讨论】:

【参考方案1】:

我一直在研究同样的问题...

根据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)

【讨论】:

以上是关于如何以编程方式告诉 Celery 将所有日志消息发送到标准输出或标准错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 celery 和 Django 以编程方式生成 celerybeat 条目

Celery / Django - 如何以编程方式查看工人的状态

如何以编程方式阅读 Lync 2013 IM 消息

我如何以编程方式锁定手机android

我如何以编程方式向@BotFather发送消息?

以编程方式将标签添加到 Swift 中的消息应用程序?