提供一个log4j2的配置文件样例,样例会把日志按照级别,分别打印在各自的文件中,并且按照每天进行划分,每天最多分割10个文件。另外,还有一个单独的日志,会记录特定的日志。
样例代码如下
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
static Logger logger = LogManager.getLogger(Main.class);
static Logger logger2 = LogManager.getLogger("COMBAUSERINFO");
public static void main(String[] args) throws InterruptedException {
int i=0;
while(true){
Thread.sleep(2);
logger.debug("DEBUG Message "+i); //不会打印
logger.info("INFO Message "+i); //打印在 INFO.log
logger.warn("WARN Message "+i); //打印在 WARN.log
logger.error("ERROR Message "+i); //打印在 ERROR.log
if((i++)%100==0) {
System.out.println("i="+i);
// 以下日志全部打印在 USERINFOFILE.log,同时每个等级会打印在对应的INFO.log 或 WARN.log 或 ERROR.log,并在控制台中打印
logger2.debug("User debug Message "+i);
logger2.info("User Info Message "+i);
logger2.warn("User warn Message "+i);
logger2.error("User error Message "+i);
}
}
}
}
样例的日志效果
INFO.log的内容
WARN.log的内容
USERINFOFILE.log的内容
最后,附上log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="logdir">logs</Property>
<!-- <Property name="logdir">${sys:catalina.base}/logs</Property> -->
</Properties>
<Appenders>
<!-- fileName中不知道怎么带上日期 -->
<RollingFile name="INFO"
fileName="${logdir}/INFO.log"
filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log">
<Filters>
<!--
定义两个过滤器,第一个过滤器过滤掉warn以上级别的日志,然后warn级别以下的日志,继续使用第二个过滤器
第二个过滤器接收info以上级别的日志,两个过滤器组合起来就只剩下info日志了
onMismatch="NEUTRAL" 表示没匹配到的日志级别,将继续使用下一个过滤器
-->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<!--
定义每个文件最大30M,在每天0点生成新一天的文件
interval=1,表示周期是1,因为filterPattern中的日期格式最后一位是天,所以这里表示周期是1天
modulate="true" 表示整点触发,也就是每天的0点
如果是yyyy-MM-dd-HH-mm ,则表示是在一分钟的0秒触发
-->
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30MB" />
</Policies>
<!-- 定义每天最多10个分割文件,最多保留30天-->
<DefaultRolloverStrategy max="10">
<Delete basePath="${logdir}" maxDepth="1">
<IfFileName glob="INFO_*.log" />
<IfLastModified age="30d" />
<!--
<IfLastModified age="24H" /> 保留24小时,这个单位需要和filePattern中的日期保持同一粒度
<IfLastModified age="60m" /> 保留 60分钟
-->
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="WARN"
fileName="${logdir}/WARN.log"
filePattern="${logdir}/WARN_%d{yyyy-MM-dd}_%i.log">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30MB" />
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="WARN_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="ERROR"
fileName="${logdir}/ERROR.log"
filePattern="${logdir}/ERROR_%d{yyyy-MM-dd}_%i.log">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30M" />
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="ERROR_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="USERINFOFILE"
fileName="${logdir}/USERINFOFILE.log"
filePattern="${logdir}/USERINFOFILE_%d{yyyy-MM-dd}.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="128KB" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="USERINFOFILE_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Console name="USERINFO" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
</Console>
</Appenders>
<loggers >
<logger name="COMBAUSERINFO" level="INFO">
<appender-ref ref="USERINFO" />
<appender-ref ref="USERINFOFILE" />
</logger>
<root level="INFO">
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
<appender-ref ref="ERROR" />
</root>
</loggers>
</Configuration>
上面的INFO日志节点,我把每个文件大小设置成30M了
划分周期也改成天了,如果想要改回分钟,就将
filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log" 改成filePattern="${logdir}/INFO_%d{yyyy-MM-dd-HH-mm}_%i.log" 将<IfLastModified age="30d" /> 改成<IfLastModified age="7m" />
最后,提一下log4j2的3个坑,暂时还没找到解决办法
1.首个日志文件无法带上日志,只能是INFO.log,而不能是INFO_yyyy-MM-dd.log
2.日志文件的名称中不能同时使用中括号和序号,比如[yyyy-MM-dd]-%i-INFO.log,会报错
3.日志文件分割的序号无法倒序,也就是INFO_1.log记录的日志,比INFO_2.log的日志早
如果你们知道怎么解决这三个问题,可以回复一下我