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

时间:2014-03-03 12:27:56

标签: python logging celery

如何以编程方式开启芹菜日志记录?

从终端,这很好用:

celery worker -l DEBUG

当我拨打get_task_logger(__name__).debug('hello')时,我可以在终端看到该消息。 (正在显示stdout和stderr)我甚至可以import logging并致电logger.info('hi')并查看。 (都是工作)

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

如何告诉Celery将日志消息的副本发送回stdout?

我已经阅读了一些关于日志记录的在线文章,但似乎已经弃用了许多来自芹菜的与日志相关的配置变量,而且我从文档中不清楚今天支持的路径是什么。

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

示例 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格式的文本行。

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

1 个答案:

答案 0 :(得分:4)

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

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