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

Spark作业中Hive INFO日志无法完全屏蔽,寻求解决方法

解决Spark作业残留INFO日志的问题

我来帮你排查下这个问题——你遇到的残留INFO日志,主要是因为现有配置没精准覆盖到输出日志的特定子包,还有可能是NOAPPENDER未正确定义导致的。下面给你拆解原因和具体解决办法:

问题根源分析

你当前的log4j配置只针对顶层的org和org.apache包设置了ERROR级别,但那些残留的日志来自更细分的子包:

  • INFO metastore: Connected to metastore. 来自 org.apache.hadoop.hive.metastore
  • INFO Hive: Registering function... 来自 org.apache.hadoop.hive
  • INFO 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:07