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

Log4j2 TimeBasedTriggeringPolicy无日志输出问题及解决方案

Log4j滚动日志配置问题排查与解决

问题背景

尝试配置Log4j的TimeBasedTriggeringPolicy实现每5分钟生成新日志文件,但配置后无日志输出,以下是相关排查信息:

依赖配置

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.1</version>
</dependency>

初始无效配置

log4j.rootLogger=INFO,rolling

log4j.appender.rolling.type=RollingFile
log4j.appender.rolling.name=fileAppender
log4j.appender.rolling.fileName=${spark.yarn.app.container.log.dir}/spark-${date:yyyyMMdd_HH-mm}.log
log4j.appender.rolling.filePattern=${spark.yarn.app.container.log.dir}/spark-%d{yyyyMMdd_HH-mm}-%i.log
log4j.appender.rolling.layout.type=PatternLayout
log4j.appender.rolling.layout.pattern=%d %p %t %c - %m%n
log4j.appender.rolling.policies.type=Policies
log4j.appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
log4j.appender.rolling.policies.time.interval=5
log4j.appender.rolling.policies.time.modulate=true

log4j.rootLogger.level=info
log4j.rootLogger.appenderRef.rolling.ref=fileLogger

错误日志输出

log4j:ERROR Could not find value for key log4j.appender.rolling
log4j:ERROR Could not instantiate appender named "rolling".
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/mnt1/yarn/usercache/hadoop/filecache/45/__spark_libs__6130489434181934811.zip/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

问题原因分析

  • Log4j版本语法混用:初始配置同时使用了Log4j 2的语法(如log4j.appender.rolling.type=RollingFile)和Log4j 1.x的配置项(如log4j.rootLogger),两种语法不兼容,导致Appender无法实例化。
  • Appender引用不匹配:配置中定义的Appender名称为fileAppender,但rootLogger.appenderRef.rolling.ref指向了不存在的fileLogger,无法正确关联日志输出目标。
  • Spark环境配置覆盖:错误日志显示系统加载了Spark默认的Log4j配置,自定义配置未生效;同时存在多个SLF4J绑定,引发日志框架加载冲突。

最终可用配置(每分钟生成日志,支持滚动)

log4j.rootLogger=INFO, loggerId
log4j.appender.loggerId=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.loggerId.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.loggerId.rollingPolicy.ActiveFileName=${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.loggerId.rollingPolicy.FileNamePattern=${spark.yarn.app.container.log.dir}/spark_%d{dd-HHmm}.log.gz
log4j.appender.loggerId.layout=org.apache.log4j.PatternLayout
log4j.appender.loggerId.layout.ConversionPattern=%d %p %t %c - %m%n
log4j.appender.loggerId.encoding=UTF-8

配置说明

  • 采用Log4j 1.x兼容的RollingFileAppender和TimeBasedRollingPolicy,适配Spark环境默认的日志框架版本。
  • FileNamePattern中的%d{dd-HHmm}实现每分钟生成新日志文件,若需每5分钟生成,可修改为%d{yyyyMMdd_HH-mm}并调整滚动策略的时间间隔参数。
  • 通过ActiveFileName指定当前写入的日志文件,滚动后的日志自动压缩为GZ格式,节省存储空间。

内容的提问来源于stack exchange,提问作者sojim2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:40:34