如何配置EMR Serverless将Spark应用日志正确输出到stdout和stderr
问题描述
我在EMR Serverless上运行Scala Spark应用,所有日志默认输出至stderr,日志级别为info(这是Spark的默认行为)。我已调整日志级别配置,但所有日志仍输出至stderr,尝试过指定appender到stdout的配置也无效,需要将com.myapp包下的应用日志输出到stdout。
之前尝试的配置:
- 调整日志级别的配置:
"rootLogger.level": "warn" "logger.myapp.name": "com.myapp", "logger.myapp.level": "info",
- 尝试的完整配置:
{ "classification": "spark-executor-log4j2", "configurations": [], "properties": { "rootLogger.level": "warn", "appender.myapp.target": "stdout", "appender.myapp.layout.type": "PatternLayout", "appender.myapp.name": "myapp", "appender.myapp.type": "Console", "logger.myapp.name": "com.myapp", "logger.myapp.level": "info", "logger.myapp.appenderRef.myappout.ref": "myapp", "logger.myapp.appenderRefs": "myappout" } }
解决方案
要让com.myapp的日志输出到stdout,需同时配置Spark Driver和Executor的log4j2规则,覆盖默认的stderr输出行为,具体配置如下:
完整配置示例
提交应用时,将以下配置作为configurationOverrides传入:
[ { "classification": "spark-log4j2", "properties": { "rootLogger.level": "warn", // 定义输出到stdout的Console Appender "appender.stdout.type": "Console", "appender.stdout.name": "STDOUT", "appender.stdout.target": "SYSTEM_OUT", "appender.stdout.layout.type": "PatternLayout", "appender.stdout.layout.pattern": "%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n", // 绑定com.myapp日志到STDOUT Appender,关闭继承root的输出 "logger.myapp.name": "com.myapp", "logger.myapp.level": "info", "logger.myapp.additivity": "false", "logger.myapp.appenderRef.stdout.ref": "STDOUT" } }, { "classification": "spark-executor-log4j2", "properties": { "rootLogger.level": "warn", "appender.stdout.type": "Console", "appender.stdout.name": "STDOUT", "appender.stdout.target": "SYSTEM_OUT", "appender.stdout.layout.type": "PatternLayout", "appender.stdout.layout.pattern": "%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n", "logger.myapp.name": "com.myapp", "logger.myapp.level": "info", "logger.myapp.additivity": "false", "logger.myapp.appenderRef.stdout.ref": "STDOUT" } } ]
关键配置要点
additivity: false:必须设置,防止com.myapp的日志同时被root logger的默认stderr appender输出。target: SYSTEM_OUT:log4j2中SYSTEM_OUT对应stdout,明确指定输出目标,避免默认的stderr行为。- 同时配置Driver和Executor:EMR Serverless中Driver与Executor使用独立的log4j2配置,仅配置其中一个会导致部分日志仍输出到stderr。
- PatternLayout:可选配置,用于定义日志格式,可保持与Spark默认格式一致或自定义。
验证
应用运行后,com.myapp的info级别日志会输出到stdout,root logger的warn及以上级别日志仍输出到stderr。
内容的提问来源于stack exchange,提问作者Darragh.McL
相关产品推荐
相关产品推荐

