Spark作业中Hive INFO日志无法完全屏蔽,寻求解决方法
解决Spark作业残留INFO日志的问题
我来帮你排查下这个问题——你遇到的残留INFO日志,主要是因为现有配置没精准覆盖到输出日志的特定子包,还有可能是NOAPPENDER未正确定义导致的。下面给你拆解原因和具体解决办法:
问题根源分析
你当前的log4j配置只针对顶层的org和org.apache包设置了ERROR级别,但那些残留的日志来自更细分的子包:
INFO metastore: Connected to metastore.来自org.apache.hadoop.hive.metastoreINFO Hive: Registering function...来自org.apache.hadoop.hiveINFO ContextHandler: Started...来自org.eclipse.jetty.server.handler.ContextHandler
另外,你配置里用到的NOAPPENDER如果没有提前定义为NullAppender,log4j会默认回退到根appender,导致日志还是会输出。
解决办法
1. 完善log4j.properties配置
首先补全NullAppender的定义,然后精准覆盖那些子包的日志级别:
# 定义NullAppender,确保不输出日志 log4j.appender.NOAPPENDER=org.apache.log4j.varia.NullAppender log4j.appender.NOAPPENDER.layout=org.apache.log4j.PatternLayout # 关闭org下所有包的日志传递到根logger log4j.additivity.org=false # 全局设置org下所有包为ERROR级别,使用NullAppender log4j.logger.org=ERROR, NOAPPENDER # 针对残留日志的特定子包,单独设置级别 log4j.logger.org.apache.hadoop.hive=ERROR, NOAPPENDER log4j.logger.org.apache.hadoop.hive.metastore=ERROR, NOAPPENDER log4j.logger.org.eclipse.jetty.server.handler.ContextHandler=ERROR, NOAPPENDER # 保留你需要的少数包的日志(示例:com.yourcompany) log4j.logger.com.yourcompany=INFO, console log4j.additivity.com.yourcompany=false # 定义控制台输出的appender(如果需要保留日志到控制台) log4j.appender.console=org.apache.log4j.ConsoleAppender 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
2. 编程方式补充控制
如果log4j.properties加载有优先级问题,或者需要动态调整,可以在代码里针对这些子包单独设置日志级别:
// 关闭Hive及metastore的INFO日志 org.apache.log4j.Logger hiveLogger = org.apache.log4j.LogManager.getLogger("org.apache.hadoop.hive"); hiveLogger.setLevel(org.apache.log4j.Level.ERROR); hiveLogger.setAdditivity(false); org.apache.log4j.Logger metastoreLogger = org.apache.log4j.LogManager.getLogger("org.apache.hadoop.hive.metastore"); metastoreLogger.setLevel(org.apache.log4j.Level.ERROR); metastoreLogger.setAdditivity(false); // 关闭Jetty ContextHandler的INFO日志 org.apache.log4j.Logger jettyLogger = org.apache.log4j.LogManager.getLogger("org.eclipse.jetty.server.handler.ContextHandler"); jettyLogger.setLevel(org.apache.log4j.Level.ERROR); jettyLogger.setAdditivity(false); // 保留目标包的日志(示例:com.yourcompany) org.apache.log4j.Logger myLogger = org.apache.log4j.LogManager.getLogger("com.yourcompany"); myLogger.setLevel(org.apache.log4j.Level.INFO); myLogger.setAdditivity(false);
3. 额外注意事项
- 确保自定义log4j.properties被Spark正确加载:提交作业时添加参数
--files log4j.properties,同时设置:spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.properties" spark.executor.extraJavaOptions="-Dlog4j.configuration=file:log4j.properties" - 检查Spark默认的log4j配置(spark-conf目录下),确保自定义配置优先级更高;如果是Spark 2.x+使用log4j2,需要对应调整配置文件格式(但从你的代码看是log4j 1.x,无需担心)。
内容的提问来源于stack exchange,提问作者Abhishek Soni
相关产品推荐
相关产品推荐

