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

如何通过Scala代码配置Spark-submit任务输出日志到文件并设置DEBUG级别

问题解决步骤

核心原因分析

  • Appender配置顺序错误:你在设置Layout之前调用了activateOptions(),log4j要求所有配置项设置完成后再调用该方法才会生效,且RollingFileAppender默认阈值为INFO,未显式设置的话会拦截所有低于INFO级别的日志。
  • Spark默认日志配置优先级更高:Spark启动时会优先加载自身默认的log4j配置,可能覆盖你代码中后续设置的日志级别。
  • 缺少测试用DEBUG日志:你提供的示例代码中仅打印了INFO级别的日志,无法直接验证DEBUG级别是否生效。

解决方案

1. 修正代码中日志配置逻辑

调整配置顺序,显式设置Appender的DEBUG阈值:

import org.apache.log4j
import org.apache.spark.sql.SparkSession
import org.apache.log4j.{Level, Logger, PatternLayout, RollingFileAppender}

trait SparkContextProvider {
  def spark: SparkSession
}

trait Logs extends SparkContextProvider {

  lazy val logging: log4j.Logger = Logger.getLogger(getClass.getName)
  lazy val applicationId: String = spark.sparkContext.applicationId

  // 第一步:先初始化格式配置
  val layOut = new PatternLayout()
  layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n")

  // 第二步:配置Appender所有参数
  val appender = new RollingFileAppender()
  appender.setLayout(layOut)
  appender.setAppend(true)
  appender.setMaxFileSize("50MB")
  appender.setMaxBackupIndex(10)
  // 显式设置Appender阈值为DEBUG,允许DEBUG级别日志输出
  appender.setThreshold(Level.DEBUG)
  appender.setFile("/usr/spark-3.0.2/app-logs/spark-" + applicationId + ".log")
  // 所有配置完成后再调用激活方法
  appender.activateOptions()

  logging.addAppender(appender)
  logging.setLevel(Level.DEBUG)
  // 可选:避免日志同时输出到root的控制台Appender,按需开启
  // logging.setAdditivity(false)
}

object DataExtractionProcess extends Logs {
    def Main(): Unit = {
        // 增加DEBUG日志测试
        logging.debug("测试DEBUG级别日志输出")
        logging.info("hello test world")
    }
    
    override def spark: SparkSession = SparkSession.builder
        .appName("PredictiveDataOperation")
        .getOrCreate()
}

2. 优先通过配置文件设置日志(推荐)

代码中动态配置日志容易被Spark默认配置覆盖,更稳定的方式是独立编写log4j.properties文件,提交任务时指定加载:
log4j.properties示例:

log4j.rootLogger=DEBUG, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/usr/spark-3.0.2/app-logs/spark-app.log
log4j.appender.file.MaxFileSize=50MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=DEBUG
# 限制Spark自身日志输出级别,避免DEBUG日志过多
log4j.logger.org.apache.spark=INFO
log4j.logger.org.apache.hadoop=INFO

提交任务时添加参数加载配置:

spark-submit \
  --class DataExtractionProcess \
  --conf spark.driver.extraJavaOptions=-Dlog4j.configuration=file:./log4j.properties \
  --conf spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties \
  --files ./log4j.properties \
  你的jar包路径.jar

其他注意事项

  • Executor端日志不会写入Driver本地文件:如果需要收集Executor上的业务日志,需要到各Executor节点的日志目录查看,或接入ELK等集中式日志系统。
  • 路径权限问题:确认运行Spark任务的用户对/usr/spark-3.0.2/app-logs/目录有读写权限。

内容的提问来源于stack exchange,提问作者ilmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:57:03