log4j2 自动删除日志目录及文件
原因:
通常的log4j2配置文件如下,注意delete插件这个element,一般只是展示一个配置
现象:
这样的配置就会出现一个问题,具体日志文件的上父目录没有被删除
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Properties> <Property name="baseDir">logsProperty> 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">logsProperty> 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> 1617 19 DefaultRolloverStrategy> 20 RollingFile> 21 Appenders> 22 <Loggers> 23 <Root level="error"> 24 <AppenderRef ref="RollingFile"/> 25 Root> 26 Loggers> 27 Configuration>18