Log4j迁移至Log4j2 2.17.X:配置滚动日志使最新文件为带时间戳基础文件
问题分析
你当前的配置逻辑和Log4j2默认滚动策略冲突:默认RollingFileAppender会先写入固定的fileName,触发滚动时才将其重命名为filePattern格式的归档文件,再新建fileName继续写入。但你的需求是活跃日志文件本身就带最新时间戳,滚动后直接切换到新的时间戳文件,这需要用DirectWriteRolloverStrategy实现。
解决方案
修改代码,调整滚动策略和文件命名配置:
- 替换滚动策略为
DirectWriteRolloverStrategy,跳过默认的「固定文件名写入→滚动重命名」流程,直接生成带时间戳的活跃文件 - 调整
filePattern格式,去掉多余的-,匹配你需要的fileNameyyyyMMdd_HHmmss_SSS.log格式 - 确保触发策略为基于文件大小的
SizeBasedTriggeringPolicy,并配置正确阈值 - 修正代码中错误的
start()调用对象
修改后的完整代码:
// 构建基于大小的触发策略(替换你原有的createTriggeringPolicy逻辑) SizeBasedTriggeringPolicy triggeringPolicy = SizeBasedTriggeringPolicy.newBuilder() .withSize("xMB") // 替换x为实际数值,比如"10MB" .build(); // 构建DirectWrite滚动策略 DirectWriteRolloverStrategy rolloverStrategy = DirectWriteRolloverStrategy.newBuilder() .build(); RollingFileAppender.Builder rollbuilder = RollingFileAppender.newBuilder(); rollbuilder.setConfiguration(config); // DirectWrite模式下无需设置固定fileName,直接用带时间戳的filePattern rollbuilder.withFilePattern(fileName + "%d{yyyyMMdd_HHmmss_SSS}.log"); rollbuilder.withAppend(true); rollbuilder.setName(directory); rollbuilder.setIgnoreExceptions(false); rollbuilder.setLayout(patternLayout); rollbuilder.withPolicy(triggeringPolicy); rollbuilder.withStrategy(rolloverStrategy); RollingFileAppender rollingFileAppender = rollbuilder.build(); rollingFileAppender.start(); // 注意:调用构建好的Appender的start方法,而非Builder
关键说明
DirectWriteRolloverStrategy:是实现「当前文件带时间戳」的核心,滚动时直接创建新的时间戳文件作为当前活跃文件- 触发策略:必须明确配置
SizeBasedTriggeringPolicy的大小阈值,确保文件达到指定大小后触发滚动 - 代码修正:原代码中
rollbuilder.start()是错误的,需调用rollingFileAppender.start()完成初始化
内容的提问来源于stack exchange,提问作者user2384519
相关产品推荐
相关产品推荐

