You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:04:52