如何以编程方式开启芹菜日志记录?
从终端,这很好用:
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
答案 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)