AWS Glue日志问题:Logger.info输出至错误日志组而非输出日志组
AWS Glue日志异常:Logger日志输出至错误日志组而非输出日志组
问题描述
使用Glue Logger打印的日志全部进入CloudWatch错误日志组,而print语句的内容能正常输出到输出日志组。涉及代码如下:
sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session logger = glueContext.get_logger() job = Job(glueContext) job.init(args['JOB_NAME'], args) logger.info("Started Processing")
原因分析
AWS Glue默认的Logger配置基于Log4j,且默认将所有级别日志绑定到System.err(错误输出流),因此会被CloudWatch归类到错误日志组;而print语句直接输出到System.out(标准输出流),所以能进入输出日志组。
解决方法
方法1:通过作业参数+自定义Log4j配置文件
- 打开AWS Glue控制台,找到目标作业并进入编辑页面
- 切换到「安全配置、脚本库和作业参数(可选)」区域
- 在「作业参数」中添加:
- 键:
--conf - 值:
spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///tmp/log4j.properties spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///tmp/log4j.properties
- 键:
- 在Glue脚本开头添加代码,生成自定义Log4j配置文件到
/tmp目录:
import os # 定义Log4j配置内容,将日志输出到System.out log4j_conf = """ log4j.rootLogger=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n """ # 写入配置文件到/tmp目录 with open('/tmp/log4j.properties', 'w') as f: f.write(log4j_conf)
方法2:脚本内动态修改Log4j配置
无需修改作业参数,直接在脚本中调整Log4j的输出目标:
from py4j.java_gateway import java_import # 导入Log4j相关Java类 java_import(spark._jvm, 'org.apache.log4j.Logger') java_import(spark._jvm, 'org.apache.log4j.ConsoleAppender') java_import(spark._jvm, 'org.apache.log4j.PatternLayout') java_import(spark._jvm, 'org.apache.log4j.Level') # 获取根Logger实例 root_logger = spark._jvm.Logger.getRootLogger() # 移除所有默认的Appender for appender in root_logger.getAllAppenders(): root_logger.removeAppender(appender) # 创建输出到System.out的ConsoleAppender console_appender = spark._jvm.ConsoleAppender() pattern_layout = spark._jvm.PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n") console_appender.setLayout(pattern_layout) console_appender.setTarget("System.out") console_appender.activateOptions() # 将新Appender添加到根Logger并设置日志级别 root_logger.addAppender(console_appender) root_logger.setLevel(spark._jvm.Level.INFO)
配置完成后,logger.info()等日志会输出到System.out,从而进入CloudWatch的输出日志组。
内容的提问来源于stack exchange,提问作者saiyantan
相关产品推荐
相关产品推荐

