Celery任务中print语句无输出问题排查求助
这问题我碰到过好多次了!Celery默认不会把print的内容直接输出到控制台,因为它会捕获标准输出并重定向到日志系统里。下面给你几个实用的调试方法:
改用Celery官方日志记录器(推荐)
别用print了,直接用Celery自带的日志工具,这样输出会自动整合到Celery的日志流里。在你的tasks.py里这么写:from celery.utils.log import get_task_logger logger = get_task_logger(__name__) @app.task def your_task(): logger.info("任务开始执行") # 你的任务逻辑 logger.debug("调试信息:这里是变量X的值: %s", some_variable) logger.error("如果出错了,这里会显示错误日志")然后启动worker的时候指定日志级别,比如:
celery -A your_project_name worker --loglevel=INFO这样控制台就会显示所有INFO级别及以上的日志了。
启动worker时强制输出标准输出
如果你不想改代码,还是想用print,可以在启动worker的时候加上--stdout参数,同时指定日志级别:celery -A your_project_name worker --loglevel=INFO --stdout这个参数会让Celery把捕获的标准输出(也就是
print的内容)直接打印到控制台。查看Celery日志文件
如果你已经配置了Celery的日志文件(比如在settings里设置了CELERY_LOG_FILE = 'celery.log'),那print的内容大概率会被写到这个日志文件里。直接打开这个文件就能看到输出,比如用:tail -f celery.log实时查看日志更新。
用调试模式启动worker
启动worker时加上--debug参数,或者把日志级别调到DEBUG,这样能看到更详细的调试信息,包括print的内容:celery -A your_project_name worker --loglevel=DEBUG临时重定向标准输出到错误输出(应急方案)
如果只是临时调试,不想改太多代码,可以在tasks.py开头加上这段代码,把print的内容转到stderr(Celery默认不捕获stderr):import sys sys.stdout = sys.stderr这样
print的内容就会直接出现在控制台了,但这个方法不适合长期用,因为会打乱正常的日志流。
最后提醒一下:启动worker的时候一定要确保指定了正确的Celery app,比如你的app在your_project.tasks里,就用-A your_project.tasks,不然worker可能找不到你的任务哦!
内容的提问来源于stack exchange,提问作者arush1836

