原因:
通常的log4j2配置文件如下,注意delete插件这个element,一般只是展示一个配置
现象:
这样的配置就会出现一个问题,具体日志文件的上父目录没有被删除
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Properties> <Property name="baseDir">logs</Property> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${baseDir}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <CronTriggeringPolicy schedule="0 0 0 * * ?"/> <DefaultRolloverStrategy> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz" /> <IfLastModified age="P60D" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
原因:
但查看org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy#createStrategy这个函数
由于配置文件被解析后,通过该函数进行构建对应的strategy,入参函数action是一个数组,所以可以传递多个action行为。
解决办法:
如果需要删除basePath下的由log4j2按年月日自动生成的目录,需要再指定一个action,并且他的maxDepth为basePath到该目录的层级数,以上面配置为例,则maxDepth为1
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="warn" name="MyApp" packages=""> 3 <Properties> 4 <Property name="baseDir">logs</Property> 5 </Properties> 6 <Appenders> 7 <RollingFile name="RollingFile" fileName="${baseDir}/app.log" 8 filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz"> 9 <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> 10 <CronTriggeringPolicy schedule="0 0 0 * * ?"/> 11 <DefaultRolloverStrategy> 12 <Delete basePath="${baseDir}" maxDepth="2"> 13 <IfFileName glob="*/app-*.log.gz" /> 14 <IfLastModified age="P60D" /> 15 </Delete> 16 <Delete basePath="${baseDir}" maxDepth="1"> 17 <IfLastModified age="P60D" /> 18 </Delete> 19 </DefaultRolloverStrategy> 20 </RollingFile> 21 </Appenders> 22 <Loggers> 23 <Root level="error"> 24 <AppenderRef ref="RollingFile"/> 25 </Root> 26 </Loggers> 27 </Configuration>