亲测有效
1.设置最大个数
2.定时清理过期日志配置
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300"> <!-- debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/"-->
<!-- 设置每天晚上12点清除过期日志文件 -->
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
<properties>
<property name="LOG_HOME">logs/kg</property>
<property name="FILE_NAME">kg</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>
</Console>
<RollingRandomAccessFile name="MyFile"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log">
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/> <!--每1小时/分/... 生成一个文件, 时间依据filePattern的配置-->
<SizeBasedTriggeringPolicy size="5 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="${LOG_HOME}/$${date:yyyy-MM}/" maxDepth="2">
<IfFileName glob="*.log" />
<!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用
另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
<!--7天-->
<IfLastModified age="168H" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<Logger name="mylog" level="debug" additivity="false">
<AppenderRef ref="MyFile"/>
<AppenderRef ref="Console"/>
</Logger>
<Root level="debug">
<AppenderRef ref="MyFile"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
注意:
filePattern
定义的日志文件后缀精确的时间决定了定期生成日志文件. 精确到dd
, 即%d{yyyy-MM-dd}
, 则会每天生成一个文件, 精确到HH
, 则会每时生成一个文件, ...- <CronTriggeringPolicy schedule="0 0 0 * * ?"/> 这个标签是设置什么时候执行清理的,这里设置的是每天凌晨具体可以参考:https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/util/CronExpression.html
Delete
标签内决定了删除过期文件的规则. 需要注意这里的IfLastModified .age
要和filePattern
精确的时间一致, 否则貌似无效.
- 我这里日志文件会按日期放入子文件夹内, 所以要想统计总数, 需要递归统计, 故设置
maxDepth=2
.此参数表示指定文件夹下需要删除文件的文件深度,如果不设置默认值为1.
依赖jar包
我这里的依赖可以实现, 将sfl4j
类的日志委托给log4j2实现. 所以项目中可以同时使用sfl4j
和log4j
类的日志系统.版本不能低于2.8
<properties>
<log4j2.version>2.11.0</log4j2.version>
</properties>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--用于与sfl4j保持桥接-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
参考文档:https://logging.apache.org/log4j/2.x/manual/appenders.html(官方文档)