如何在AWS Glue中向输出日志写入调试信息?
解决AWS Glue调试日志写入output日志的问题
我来帮你搞定这个日志输出的问题——AWS Glue默认确实会把print()的内容丢进error日志,因为它的Python环境里默认把stdout重定向到stderr了,而且有时候测试的日志还会因为配置或延迟不显示,下面给你几个靠谱的解决方案:
方法一:用Python logging模块(推荐,规范且可控)
这是最稳妥的方式,直接把日志定向到stdout,这样就会自动进入/aws-glue/jobs/output日志组。直接在脚本开头加这段配置:
import logging import sys # 获取全局logger,设置日志级别为INFO(可以根据需要改成DEBUG) logger = logging.getLogger() logger.setLevel(logging.INFO) # 移除默认handler,避免重复输出到error日志 for handler in logger.handlers[:]: logger.removeHandler(handler) # 创建一个输出到stdout的handler stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.setLevel(logging.INFO) # 可选:设置日志格式,方便排查问题 formatter = logging.Formatter('%(asctime)s - %(module)s - %(levelname)s: %(message)s') stdout_handler.setFormatter(formatter) # 把handler添加到logger logger.addHandler(stdout_handler) # 现在用logger输出调试信息,就会出现在output日志里 logger.info("Hello World!")
方法二:重定向sys.stdout到正确流
如果你就想用print(),可以手动把stdout改回Glue的标准输出流,这样print的内容就会进output日志:
import sys # 重定向stdout到系统原生的stdout流 sys.stdout = sys.__stdout__ # 现在print的内容就会写入/aws-glue/jobs/output print("Hello World!")
额外排查点(解决测试日志不显示的问题)
如果你的"Hello World!"还是没出现在日志里,检查这几点:
- 日志延迟:CloudWatch日志有时候会有1-5分钟的延迟,别急着刷新,等几分钟再看
- 日志级别配置:在Glue作业的配置页面,找到"日志级别"选项,确保设置为
INFO或DEBUG(如果设成ERROR,低级别的日志会被过滤) - 代码执行路径:确认你的调试语句确实被执行到了——比如有没有被条件分支跳过,或者作业在执行到这段代码前就失败了
内容的提问来源于stack exchange,提问作者Jesse Clark
相关产品推荐
相关产品推荐

