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

AWS EMR 7.3中Java程序日志未显示问题排查求助

排查AWS EMR 7.3 + Livy + Spark Java作业自定义日志缺失问题

以下是针对你的场景,逐一排查日志未在Livy控制台或S3中显示的核心检查点:


1. 优先检查log4j2配置文件的基础问题

  • 文件名拼写错误:你提到配置文件路径为src/main/resources/log4js.properties,这里明显存在拼写错误(应为log4j2.properties),JVM会因找不到正确的配置文件而使用默认日志规则,直接导致自定义日志失效。
  • 配置内容有效性:打开你的log4j2.properties,确认以下关键配置:
    # 根日志级别需与代码中使用的级别匹配(如代码用debug则根级别设为DEBUG)
    rootLogger.level = INFO
    # 必须配置控制台输出Appender(对应Livy控制台日志)
    rootLogger.appenderRef.console.ref = ConsoleAppender
    # 配置文件输出Appender(EMR会自动同步本地日志到S3)
    rootLogger.appenderRef.file.ref = RollingFileAppender
    
    appender.console.type = Console
    appender.console.name = ConsoleAppender
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    
    appender.file.type = RollingFile
    appender.file.name = RollingFileAppender
    appender.file.fileName = /var/log/spark/app.log
    appender.file.layout.type = PatternLayout
    appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
    
  • 配置文件是否打包进Jar:执行jar tf your-job.jar,确认log4j2.properties存在于/log4j2.properties路径下。

2. 检查EMR集群的Spark日志配置

打开EMR的spark-defaults和spark-log4j2配置,确认:

  • 是否指定了自定义log4j2配置文件的加载路径:
    # 如果配置文件在S3上
    spark.driver.log4j2.properties = s3://your-bucket/config/log4j2.properties
    spark.executor.log4j2.properties = s3://your-bucket/config/log4j2.properties
    # 如果配置文件在Jar包内
    spark.driver.extraJavaOptions = -Dlog4j.configurationFile=log4j2.properties
    spark.executor.extraJavaOptions = -Dlog4j.configurationFile=log4j2.properties
    
  • 是否开启了Spark日志到S3的同步:
    spark.eventLog.enabled = true
    spark.eventLog.dir = s3://your-bucket/spark-event-logs/
    
  • hdfs-site配置中没有禁止日志写入的规则(如权限限制、存储配额等)。

3. 检查Java项目的POM依赖冲突

Spark 3.4+(EMR 7.3默认版本)使用SLF4J作为日志门面,需确保你的POM依赖无冲突:

  • 引入正确的log4j2绑定依赖:
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.20.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.20.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.20.0</version>
    </dependency>
    
  • 排除Spark依赖中自带的旧版日志组件:
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>3.4.1</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

4. 检查Java主类的日志输出逻辑

  • 确认日志对象初始化正确(使用SLF4J门面而非直接调用log4j2):
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SparkJobMain {
        private static final Logger logger = LoggerFactory.getLogger(SparkJobMain.class);
    
        public static void main(String[] args) {
            // 确保日志级别与配置文件匹配(如配置为INFO则debug日志不会输出)
            logger.info("=== 作业启动 ===");
            logger.debug("调试信息:参数为{}", args);
        }
    }
    
  • 若Executor节点日志缺失,需确认代码中是否在分布式逻辑中输出了日志(如RDD的map操作内),且Executor的log4j配置与Driver一致。

5. 检查Livy与Lambda请求配置

  • Livy控制台日志排查:搜索Livy日志中是否存在Could not find log4j2 configuration file或Log configuration overridden等错误提示,确认配置加载失败原因。
  • Lambda Payload检查:确认请求中传递的Spark配置包含日志相关参数:
    {
      "file": "s3://your-bucket/spark-job.jar",
      "className": "com.example.SparkJobMain",
      "conf": {
        "spark.driver.extraJavaOptions": "-Dlog4j.configurationFile=log4j2.properties",
        "spark.executor.extraJavaOptions": "-Dlog4j.configurationFile=log4j2.properties",
        "spark.logConf": "true",
        "spark.eventLog.enabled": "true"
      }
    }
    

6. 检查EMR日志收集配置

确认集群创建时指定了日志存储的S3路径(--log-uri s3://your-bucket/emr-logs/),且EMR服务角色拥有该路径的读写权限。

内容的提问来源于stack exchange,提问作者Voon see hong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:30:58