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

如何在本地模式下通过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加载默认模板:
    spark-submit --conf "spark.driver.extraJavaOptions=-Dlog4j.configurationFile=/path/to/spark/conf/log4j2.properties" --class com.your.package.YourApp target/your-app.jar
    
    若直接用java命令运行jar包:
    java -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,需去掉provided scope):
    <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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:36:08