一.说明
本例子要求使用jar为2.7以上使用的jar为:log4j-core-2.7.jar,log4j-api-2.7.jar。
二.XML关键标签
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<Properties>
<!--注意根目录写法:若/logs则日志写到项目所在磁盘的位置,若logs则是项目运行时的 目录下 -->
<Property name="logPath">logs</Property>
<Property name="info">${logPath}/info</Property>
</Properties>
<appenders>
<!--这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="%d %p [%c{1}:%L] %m%n" />
</Console>
<RollingFile name="infoLog" fileName="${info}/info.log"
filePattern="${info}/info-%d{yyyy-MM-dd-HH-mm}-%i.log.gz">
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY" />
<ThresholdFilter level="error" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout pattern="%d %p [%c{1}:%L] %m%n" />
<Policies>
<SizeBasedTriggeringPolicy size="20KB" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="4">
<Delete basePath="${info}/" maxDepth="1">
<IfFileName glob="*info-*.log.gz" />
<IfLastModified age="20m"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<loggers>
<!--建立一个默认的root的logger -->
<root level="info">
<appender-ref ref="infoLog" />
<appender-ref ref="Console" />
</root>
</loggers>
</configuration>
- SizeBasedTriggeringPolicy
触发压缩的标签,达到20KB触发压缩 - DefaultRolloverStrategy
filePattern="${info}/info-%d{yyyy-MM-dd-HH-mm}-%i.log.gz
控制满足条件的个数(%i),如xml中设置为4,即info-2018-11-21-15-53中53min时最多有4个文件,之后就在这四个文件中进行回滚覆盖。 - Delete
这个标签是jar2.5之后才支持,可以设置保留多少天内的日志
如:Xml中保留20min种之内的文件,之后进行回滚覆盖。
其中的age后的单位要与filePattern="${info}/info-%d{yyyy-MM-dd-HH-mm}-%i.log.gz中的%d{yyyy-MM-dd-HH-mm}最后一位保持一致。例如打算保留10天的日志,需要设置%d{yyyy-MM-dd} ,age=10d。
三.案例
-
保留10天内的日志,每天内的日志不回滚,单个日志达到100M压缩
分析:由于当天的不回滚,故DefaultRolloverStrategy 中max尽可能设置大一点,filePattern="${info}/info-%d{yyyy-MM-dd}-%i.log.gz"中精确到天,单位为d。<RollingFile name="infoLog" fileName="${info}/info.log" filePattern="${info}/info-%d{yyyy-MM-dd}-%i.log.gz"> <Filters> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" /> </Filters> <PatternLayout pattern="%d %p [%c{1}:%L] %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="20KB" /> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> <DefaultRolloverStrategy max="4"> <Delete basePath="${info}/" maxDepth="1"> <IfFileName glob="*info-*.log.gz" /> <IfLastModified age="10d> </Delete> </DefaultRolloverStrategy>
-
每天只生成一个文件,保留10天日志
<RollingFile name="infoLog" fileName="${info}/info.log" filePattern="${info}/info-%d{yyyy-MM-dd}-%i.log.gz"> <Filters> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> <PatternLayout pattern="%d %p [%c{1}:%L] %m%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <DefaultRolloverStrategy max="4"> <Delete basePath="${info}/" maxDepth="1"> <IfFileName glob="*info-*.log.gz" /> <IfLastModified age="10d> </Delete> </DefaultRolloverStrategy>
分析:
有的日志量不是很大,可以写入到一个文件中,需要使用标签<TimeBasedTriggeringPolicy interval="1" modulate="true"/> interval控制周期。
四、总结:
有了上面几个标签,就可以灵活控制保留日志的策略,正常的组合还有:按每个文件的大小、数量、日期组合等等,这些一般能满足我们正常的日志回滚策略。