如何让Log4j2 RollingFile Appender的最新日志文件名带数字?
Log4j2配置:让所有日志文件(含最新文件)都带数字后缀
当前日志文件结构:
|-- Project |-- logfile.01.log |-- logfile.02.log |-- logfile.log
期望的日志文件结构:
|-- Project |-- logfile.01.log |-- logfile.02.log |-- logfile.03.log
原配置文件
原log4j2.xml配置如下:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Configuration monitorInterval="60"> <Properties> <Property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/> <Property name="filename" value="C:\Project\log\logfile.log"/> <Property name="filepattern" value="C:\Project\log\logfile.%02i.log"/> <Property name="filesize" value="10 MB"/> <Property name="rollovermax" value="40"/> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${filename}" filePattern="${filepattern}"> <PatternLayout pattern="${pattern}"/> <Policies> <OnStartupTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${filesize}"/> </Policies> <DefaultRolloverStrategy max="${rollovermax}" fileIndex="min"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
已尝试的无效修改
- 修改
filename为固定数字后缀:<Property name="filename" value="C:\Project\log\logfile.01.log"/>
-> 仅生成单个日志文件,且持续被覆盖 - 修改
filename为带%02i占位符:<Property name="filename" value="C:\Project\log\logfile.%02i.log"/>
-> 生成的文件名直接包含%02i字符串,滚动规则正常但主文件名不符合要求 - 修改
filename为带%i占位符:<Property name="filename" value="C:\Project\log\logfile.%i.log"/>
-> 与上一情况类似,文件名包含%i字符串 - 留空或省略
fileName属性:<RollingFile name="RollingFile" fileName="" filePattern="${filepattern}"/>
-> 无法生成任何日志文件
可行配置方案
方案1:使用DirectWriteRolloverStrategy(推荐,Log4j2 2.10.0+)
这个策略可以直接写入带数字后缀的文件,无需临时文件,配置更简洁:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Configuration monitorInterval="60"> <Properties> <Property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/> <Property name="basePath" value="C:\Project\log"/> <Property name="filePattern" value="${basePath}\logfile.%02i.log"/> <Property name="filesize" value="10 MB"/> <Property name="rollovermax" value="40"/> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${basePath}\logfile.01.log" filePattern="${filePattern}"> <PatternLayout pattern="${pattern}"/> <Policies> <SizeBasedTriggeringPolicy size="${filesize}"/> <OnStartupTriggeringPolicy/> </Policies> <DirectWriteRolloverStrategy maxFiles="${rollovermax}" fileIndex="max"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
配置说明:
DirectWriteRolloverStrategy:直接将日志写入带数字后缀的文件,跳过无后缀主文件的中间步骤fileIndex="max":让最新的日志文件使用最大的数字索引,确保其在目录排序时位于最上方- 首次启动写入
logfile.01.log,达到大小阈值后生成logfile.02.log作为最新文件,旧文件保留数量由maxFiles控制
方案2:基于DefaultRolloverStrategy的临时文件方案
适用于较低版本的Log4j2,通过临时文件过渡实现:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Configuration monitorInterval="60"> <Properties> <Property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/> <Property name="basePath" value="C:\Project\log"/> <Property name="filePattern" value="${basePath}\logfile.%02i.log"/> <Property name="filesize" value="10 MB"/> <Property name="rollovermax" value="40"/> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${basePath}\logfile.tmp.log" filePattern="${filePattern}"> <PatternLayout pattern="${pattern}"/> <Policies> <OnStartupTriggeringPolicy minSize="0"/> <SizeBasedTriggeringPolicy size="${filesize}"/> </Policies> <DefaultRolloverStrategy max="${rollovermax}" fileIndex="max"> <Delete basePath="${basePath}" maxDepth="1"> <IfFileName glob="logfile.tmp.log"/> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
配置说明:
- 主文件设为临时名称
logfile.tmp.log,避免与最终带后缀的文件冲突 OnStartupTriggeringPolicy minSize="0":确保启动时立即触发滚动,将临时文件重命名为当前最大索引的日志文件DefaultRolloverStrategy fileIndex="max":让最新文件使用最大数字索引,保证目录排序时在最上方Delete动作:滚动时清理临时文件,避免残留
效果验证
使用上述任一配置后,所有日志文件都会带有数字后缀,最新文件因数字最大会排在目录最上方,完全符合期望的文件结构。
内容的提问来源于stack exchange,提问作者Supersmuu
相关产品推荐
相关产品推荐

