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

Log4j RollingFileAppender报错:Pattern不含日期排查求助

Log4j RollingFileAppender 日期滚动配置异常排查

我在Java项目中使用Log4j实现日志功能,采用Gradle构建、IntelliJ IDEA作为开发工具,配置了RollingFileAppender以实现每日生成新日志文件,配置文件如下:

status = warn
property.filename = $${date:YYYY-MM-dd}

# Rotate log file
appender.rolling.type = RollingFile
appender.rolling.name = LogToRollingFile
appender.rolling.fileName = ../app_log/service/app-java-${date:YYYY-MM-dd}.log
appender.rolling.filePattern = app_log/service/app-java-${date:YYYY-MM-dd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%-5p] %M: %m%n
appender.rolling.policies.type = Policies
#appender.rolling.policies.time.type = OnStartupTriggeringPolicy
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.size=10MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10

#logger specific configuration
loggers
logger.name=rolling
logger.additivity = true
logger.appenderRefs = rolling
logger.appenderRef.rolling.ref = LogToRollingFile
logger.appenderRef.rolling.stdout.ref = STDOUT

#root logger configuration
rootLogger.level = INFO
#rootLogger.appenderRef.stdout.ref = LogToConsole
rootLogger.appenderRef.stdout.ref = LogToRollingFile

运行时抛出如下异常:

2023-05-05 14:37:39,819 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: Pattern does not contain a date java.lang.IllegalStateException: Pattern does not contain a date

以及:

2023-05-05 14:37:39,823 main ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender

问题原因分析

  1. filePattern格式不符合要求:
    Log4j的TimeBasedTriggeringPolicy要求filePattern必须包含动态日期占位符%d{格式},用于标识归档日志的日期规则。当前使用的${date:YYYY-MM-dd}是启动时就固定的静态变量,Log4j无法将其识别为滚动触发的日期标识,因此抛出"Pattern does not contain a date"错误。
  2. 配置层级错误:
    原配置中appender.rolling.policies.time.modulate = true被错误放置在SizeBasedTriggeringPolicy配置项附近,属于层级错误,应该归属于TimeBasedTriggeringPolicy的配置下。
  3. logger配置无效项:
    logger.appenderRef.rolling.stdout.ref = STDOUT是错误的配置格式,一个appenderRef只能对应一个引用,若需添加多个appender,应单独定义新的appenderRef项。
  4. fileName静态日期问题:
    fileName使用静态日期会导致当日志滚动时,新生成的活动日志文件仍使用启动时的日期,无法实现每日生成新文件的需求。

修正后的配置

status = warn

# Rotate log file
appender.rolling.type = RollingFile
appender.rolling.name = LogToRollingFile
# 活动日志使用固定名称,滚动归档后由filePattern生成带日期的归档文件
appender.rolling.fileName = ../app_log/service/app-java.log
# filePattern必须包含%d动态日期占位符,用于归档旧日志
appender.rolling.filePattern = ../app_log/service/app-java-%d{yyyy-MM-dd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%-5p] %M: %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10

#logger specific configuration
loggers = rolling
logger.rolling.name=rolling
logger.rolling.additivity = true
logger.rolling.appenderRefs = rolling
logger.rolling.appenderRef.rolling.ref = LogToRollingFile
# 若需同时输出到控制台,需先定义STDOUT appender,再添加如下配置
# logger.rolling.appenderRef.stdout.ref = STDOUT

#root logger configuration
rootLogger.level = INFO
rootLogger.appenderRef.rolling.ref = LogToRollingFile

修正说明

  • 调整filePattern为../app_log/service/app-java-%d{yyyy-MM-dd}.log.gz,使用动态日期占位符让Log4j识别滚动规则
  • 将fileName改为固定名称,活动日志始终写入该文件,当日志滚动时,旧日志会按照filePattern的格式归档为带日期的压缩文件
  • 修正time.modulate的配置层级,归属于TimeBasedTriggeringPolicy下
  • 移除logger配置中的无效项,规范appenderRef配置格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:29