如何在本地模式下通过Java应用设置Spark日志级别?
解决Spark 3.5.0本地模式日志泛滥问题(Ubuntu + Maven环境)
以下是针对你的环境经过验证的可行方案:
方案1:正确配置Log4j2并强制加载
Spark 3.0+默认使用Log4j2,之前的log4j.properties配置不会生效,需按以下步骤操作:
- 进入Spark安装目录的
conf文件夹,复制log4j2.properties.template为log4j2.properties - 编辑该文件,修改核心日志级别:
# 修改root日志级别为WARN或ERROR rootLogger.level = WARN # 单独屏蔽Spark、Hadoop、Jetty的冗余日志 logger.org.apache.spark.name = org.apache.spark logger.org.apache.spark.level = WARN logger.org.apache.hadoop.name = org.apache.hadoop logger.org.apache.hadoop.level = WARN logger.org.sparkproject.jetty.name = org.sparkproject.jetty logger.org.sparkproject.jetty.level = WARN - 运行应用时明确指定配置文件路径,避免Spark加载默认模板:
若直接用java命令运行jar包:spark-submit --conf "spark.driver.extraJavaOptions=-Dlog4j.configurationFile=/path/to/spark/conf/log4j2.properties" --class com.your.package.YourApp target/your-app.jarjava -Dlog4j.configurationFile=/path/to/spark/conf/log4j2.properties -cp target/your-app.jar com.your.package.YourApp
方案2:Maven打包时嵌入Log4j2配置
无需依赖Spark安装目录的配置,将配置文件打进应用jar包:
- 在项目
src/main/resources下创建log4j2.properties,内容如下:status = WARN name = PropertiesConfig appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n rootLogger.level = WARN rootLogger.appenderRef.stdout.ref = STDOUT logger.org.apache.spark.level = WARN logger.org.apache.hadoop.level = WARN logger.org.sparkproject.jetty.level = WARN - 确保Maven pom.xml中包含Log4j2依赖(若打包成fat jar,需去掉
providedscope):<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.5.0</version> <scope>provided</scope> </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-api</artifactId> <version>2.20.0</version> </dependency> </dependencies> - 打包后直接运行,配置会自动生效。
方案3:代码中提前配置日志(解决编程方式无效问题)
之前的代码配置无效是因为Spark初始化日志系统在你的代码之前,需在SparkContext初始化前执行日志配置:
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; public class YourSparkApp { public static void main(String[] args) { // 必须在SparkContext初始化前执行 LoggerContext context = (LoggerContext) LogManager.getContext(false); Configuration config = context.getConfiguration(); // 设置root日志级别 LoggerConfig rootConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); rootConfig.setLevel(Level.WARN); // 单独设置Spark相关包的日志级别 LoggerConfig sparkLogger = config.getLoggerConfig("org.apache.spark"); sparkLogger.setLevel(Level.WARN); config.addLogger("org.apache.spark", sparkLogger); context.updateLoggers(config); // 初始化SparkContext SparkConf conf = new SparkConf().setAppName("YourApp").setMaster("local[*]"); JavaSparkContext sc = new JavaSparkContext(conf); // 你的业务代码... } }
方案4:命令行直接指定日志级别
无需修改任何配置文件,运行时通过参数强制覆盖:
spark-submit --conf "spark.driver.extraJavaOptions=-Dlog4j2.rootLogger.level=WARN" --class com.your.package.YourApp target/your-app.jar
内容的提问来源于stack exchange,提问作者Tristpost
相关产品推荐
相关产品推荐

