原因:
通常的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>