Hive Metastore中Log4j日志清理原理咨询及配置异常排查
Hive Metastore中Log4j日志清理原理咨询及配置异常排查
看起来你在配置Hive Metastore的Log4j2滚动日志时遇到了几个和预期不符的问题,我来帮你拆解下可能的原因和调整方向:
首先先把你的配置贴出来方便参考:
status = INFO name = HiveLog4j2 packages = org.apache.hadoop.hive.ql.log property.hive.log.level = INFO property.hive.root.logger = DRFA property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name} property.hive.log.file = hive.log property.hive.perflogger.log.level = INFO appenders = console, DRFA appender.console.type = Console appender.console.name = console appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{ISO8601} %5p [%t] %c{2}: %m%n appender.DRFA.type = RollingRandomAccessFile appender.DRFA.name = DRFA appender.DRFA.fileName = ${sys:hive.log.dir}/${sys:hive.log.file} appender.DRFA.filePattern = ${sys:hive.log.dir}/${sys:hive.log.file}.%d{yyyy-MM-dd-hh-mm} appender.DRFA.layout.type = PatternLayout appender.DRFA.layout.pattern = %d{ISO8601} %5p [%t] %c{2}: %m%n appender.DRFA.policies.type = Policies appender.DRFA.policies.time.type = SizeBasedTriggeringPolicy appender.DRFA.policies.time.size = 4Kb appender.DRFA.strategy.type = DefaultRolloverStrategy appender.DRFA.strategy.max = 3 appender.DRFA.strategy.fileIndex = nomax appender.DRFA.strategy.action.type = Delete appender.DRFA.strategy.action.basepath = ${sys:hive.log.dir} appender.DRFA.strategy.action.condition.type = IfFileName appender.DRFA.strategy.action.condition.glob = ${sys:hive.log.file}* appender.DRFA.strategy.action.condition.ifAny.type = IfAny appender.DRFA.strategy.action.condition.ifAny.ifAccumulatedFileSize.type = IfAccumulatedFileSize appender.DRFA.strategy.action.condition.ifAny.ifAccumulatedFileSize.exceeds = 30Kb # list of all loggers loggers = NIOServerCnxn, ClientCnxnSocketNIO, DataNucleus, Datastore, JPOX, PerfLogger, AmazonAws, ApacheHttp logger.NIOServerCnxn.name = org.apache.zookeeper.server.NIOServerCnxn logger.NIOServerCnxn.level = WARN logger.ClientCnxnSocketNIO.name = org.apache.zookeeper.ClientCnxnSocketNIO logger.ClientCnxnSocketNIO.level = WARN logger.DataNucleus.name = DataNucleus logger.DataNucleus.level = ERROR logger.Datastore.name = Datastore logger.Datastore.level = ERROR logger.JPOX.name = JPOX logger.JPOX.level = ERROR logger.AmazonAws.name=com.amazonaws logger.AmazonAws.level = INFO logger.ApacheHttp.name=org.apache.http logger.ApacheHttp.level = INFO logger.PerfLogger.name = org.apache.hadoop.hive.ql.log.PerfLogger logger.PerfLogger.level = ${sys:hive.perflogger.log.level} # root logger rootLogger.level = ${sys:hive.log.level} rootLogger.appenderRefs = root rootLogger.appenderRef.root.ref = ${sys:hive.root.logger}
你的预期与实际异常
预期效果
- 每分钟滚动一次日志
- 单个日志文件大小限制为4KB
- 最多保留3个日志文件
- 当日志文件夹总大小超过30KB时清理旧文件
实际异常表现
- 保留的日志文件数量远超过3个
- 实际日志文件被截断为8KB而非配置的4KB
- 日志文件夹总大小远超30KB
- 旧日志文件的清理存在5-10分钟的延迟
问题原因分析
1. 滚动触发策略配置错误
这是核心问题:你想要同时启用时间触发(每分钟滚动)和大小触发(4KB滚动),但当前配置完全写错了触发策略的类型:
- 你把时间触发的节点
appender.DRFA.policies.time.type设置成了SizeBasedTriggeringPolicy,这相当于只开启了大小触发,时间触发完全没有生效,自然不会每分钟滚动日志。 - 单个文件实际变成8KB的原因:一方面Log4j2在触发滚动时,最后一批日志可能会让文件略超配置大小;另一方面,很多Linux系统的文件系统默认块大小是4KB,文件大小会自动对齐到块的整数倍,所以会出现4KB配置实际生成8KB文件的情况。
2. 日志保留数量与清理策略的冲突
- 你设置了
strategy.max = 3(最多保留3个归档文件),但同时配置了fileIndex = nomax,这个参数会让Log4j2放弃文件索引限制,直接覆盖max的配置,导致保留的文件数量远超预期。 - 你的清理策略只有在日志滚动动作发生时才会执行,由于时间触发没生效,滚动只在文件达到4KB时才会触发,而如果日志写入速度慢,滚动触发间隔就会变长,这就是你看到旧文件5-10分钟后才被删除的原因。
3. 时间滚动的文件格式小问题
你配置的filePattern用了hh(12小时制),建议改成HH(24小时制),避免同一小时的上午和下午日志文件名重复,但这不是导致当前异常的核心原因。
调整后的配置建议
修改关键的滚动触发和保留策略部分,确保逻辑符合预期:
# 修正滚动触发策略:同时开启时间和大小触发 appender.DRFA.policies.type = Policies # 时间触发(每分钟滚动,modulate=true确保在整点/整分触发) appender.DRFA.policies.time.type = TimeBasedTriggeringPolicy appender.DRFA.policies.time.interval = 1 appender.DRFA.policies.time.modulate = true # 大小触发(单个文件4KB) appender.DRFA.policies.size.type = SizeBasedTriggeringPolicy appender.DRFA.policies.size.size = 4Kb # 修正滚动策略:移除fileIndex=nomax,让max=3生效 appender.DRFA.strategy.type = DefaultRolloverStrategy appender.DRFA.strategy.max = 3 # 清理策略保持,但确保在每次滚动时执行 appender.DRFA.strategy.action.type = Delete appender.DRFA.strategy.action.basepath = ${sys:hive.log.dir} appender.DRFA.strategy.action.condition.type = IfFileName appender.DRFA.strategy.action.condition.glob = ${sys:hive.log.file}* appender.DRFA.strategy.action.condition.ifAny.type = IfAny appender.DRFA.strategy.action.condition.ifAny.ifAccumulatedFileSize.type = IfAccumulatedFileSize appender.DRFA.strategy.action.condition.ifAny.ifAccumulatedFileSize.exceeds = 30Kb
额外测试建议
- 测试时可以暂时把单个文件大小调大到10KB,避免文件系统块大小导致的实际大小偏差影响判断
- 开启Log4j2的状态日志(你的配置已经设置
status = INFO),控制台会输出滚动和清理动作的详细日志,方便你排查问题 - 修改配置后,一定要完全重启Hive Metastore服务,避免旧配置缓存生效
内容来源于stack exchange
相关产品推荐
相关产品推荐

