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
相关产品推荐
相关产品推荐

