如何在Spark特定应用中单独禁用INFO日志消息?
针对单个Spark应用禁用INFO日志的解决方案
嗨,我明白你不想修改全局Spark日志配置,只希望单个应用屏蔽INFO级别的日志——这完全合理,毕竟全局改了会影响所有应用。下面给你几个靠谱的方案,按推荐程度排序:
方案一:在应用代码中动态设置日志级别(最直接)
这个方法的关键是必须在初始化SparkSession/SparkContext之前设置日志级别,不然Spark启动阶段的INFO日志还是会跑出来。举个Scala代码示例:
import org.apache.log4j.{Level, Logger} import org.apache.spark.sql.SparkSession object YourTargetApp { def main(args: Array[String]): Unit = { // 先把核心包的日志级别调到WARN,屏蔽INFO Logger.getLogger("org").setLevel(Level.WARN) Logger.getLogger("akka").setLevel(Level.WARN) // 如果需要更精准,也可以单独控制Spark相关包 Logger.getLogger("org.apache.spark").setLevel(Level.WARN) // 再初始化SparkSession val spark = SparkSession.builder() .appName("SingleAppLogControl") .getOrCreate() // 你的业务逻辑代码... spark.stop() } }
如果是Java应用,逻辑完全一致,只是语法调整:
import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.sql.SparkSession; public class YourJavaSparkApp { public static void main(String[] args) { Logger.getLogger("org").setLevel(Level.WARN); Logger.getLogger("akka").setLevel(Level.WARN); SparkSession spark = SparkSession.builder() .appName("JavaSingleAppLog") .getOrCreate(); // 业务逻辑... spark.stop(); } }
方案二:提交应用时指定自定义log4j配置文件(最灵活)
如果需要更精细的日志控制(比如只屏蔽某些特定类的INFO,或者自定义日志格式),可以单独写一个log4j配置文件,提交应用时指定给当前应用使用,完全不影响全局配置。
- 先写一个自定义的
log4j.properties文件,示例内容:
# 根日志级别设为WARN,输出到控制台 log4j.rootLogger=WARN, console # 控制台输出配置 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 可以单独给Spark相关包设置级别 log4j.logger.org.apache.spark=WARN log4j.logger.org.apache.hadoop=WARN # 如果有自己的业务包,也可以单独设置 log4j.logger.com.yourcompany=INFO
- 提交应用时用
--files上传配置文件,同时通过--driver-java-options指定使用这个配置:
spark-submit \ --class com.yourcompany.YourSparkApp \ --files /local/path/to/custom-log4j.properties \ --driver-java-options "-Dlog4j.configuration=file:custom-log4j.properties" \ --executor-java-options "-Dlog4j.configuration=file:custom-log4j.properties" \ your-application.jar
注意:如果是在集群模式下,
--executor-java-options也加上的话,能同时控制Executor的日志级别;如果只关心Driver端的日志,去掉这个参数就行。
方案三:Spark Shell中的临时设置
如果是在Spark Shell里测试,不想每次都改配置,可以启动Shell时直接指定:
spark-shell --conf "spark.driver.extraJavaOptions=-Dlog4j.rootLogger=WARN,console"
或者进入Shell后动态执行:
import org.apache.log4j.{Level, Logger} Logger.getRootLogger.setLevel(Level.WARN)
为什么你之前的尝试可能没成功?
大概率是设置日志级别的代码放在了SparkSession初始化之后——Spark启动过程中会先加载默认日志配置,输出一堆INFO日志,之后再改级别就只能控制后续的日志了,启动阶段的INFO还是会显示。记住:日志级别设置一定要在Spark上下文初始化之前执行!
内容的提问来源于stack exchange,提问作者mjbsgll
相关产品推荐
相关产品推荐

