如何通过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
相关产品推荐
相关产品推荐

