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
问题原因分析
- filePattern格式不符合要求:
Log4j的TimeBasedTriggeringPolicy要求filePattern必须包含动态日期占位符%d{格式},用于标识归档日志的日期规则。当前使用的${date:YYYY-MM-dd}是启动时就固定的静态变量,Log4j无法将其识别为滚动触发的日期标识,因此抛出"Pattern does not contain a date"错误。 - 配置层级错误:
原配置中appender.rolling.policies.time.modulate = true被错误放置在SizeBasedTriggeringPolicy配置项附近,属于层级错误,应该归属于TimeBasedTriggeringPolicy的配置下。 - logger配置无效项:
logger.appenderRef.rolling.stdout.ref = STDOUT是错误的配置格式,一个appenderRef只能对应一个引用,若需添加多个appender,应单独定义新的appenderRef项。 - 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
相关产品推荐
相关产品推荐

