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
相关产品推荐
相关产品推荐

