如何以编程方式打开芹菜日志?
从航站楼开始,这项工作很好:

celery worker -l DEBUG

当我呼叫get_task_logger(__name__).debug('hello')时,我可以看到消息在终端中出现。(显示stdout和stderr)我甚至可以调用并看到它。(两种工作)
但是,在开发任务时,我更喜欢使用一个测试模块并直接调用任务函数,而不是激发一个完整的工作者。但我看不到日志消息。我知道芹菜正在将所有东西重定向到它的内部设备,但我也希望看到stdout上的日志消息。
我该如何告诉芹菜将日志消息的副本发送回stdout?
我已经阅读了很多关于日志记录的在线文章,但是似乎有很多来自Cellery的日志记录相关配置变量已经被弃用,我不清楚文档中支持的路径是什么。
下面是一个创建芹菜对象并尝试记录输出的示例模块。终端中没有显示任何内容。
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

最佳答案

我一直在关注同一个问题…
根据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)

07-24 19:22
查看更多