昨天老师布置了一个作业,就是关于log4j2的,作业是将每一种隔离级别都分开来然后打包。昨天我在官网找了半天还是感觉不大会,我感觉我还是太菜了。
今天是看了同学了,感觉又学到了许多。
作业的核心就是自定义的过滤器。
但是如果是写出来的话,这个东西还是蛮简单的。
-
log4j源码的下载地址 https://logging.apache.org/log4j/2.x/download.html
-
官网里面log4j的例子 https://logging.apache.org/log4j/2.x/manual/configuration.html
最简单的一个例子(这个是官方复制的例子)
启动类
package com.foo;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Bar {
static final Logger logger = LogManager.getLogger(Bar.class.getName());
public boolean doIt() {
logger.entry();
logger.error("Did it again!");
return logger.exit(false);
}
}
配置文件名字 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
有了这个基础之后,我们第二个就是打包需求,例如我每天或者是每个星期打一次包,或者是当这个日志大小大于100M的时候我打一次包。
那么在上面那个配置文件的基础上加入这个
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="rollingfile" fileName="log.txt"
filePattern="logs/.%i.log.gz">
<PatternLayout>
<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>
</PatternLayout>
<SizeBasedTriggeringPolicy size="10MB" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
<AppenderRef ref="rollingfile"/>
</Root>
</Loggers>
</Configuration>
知道如何打包之后就是使用过滤器了,
<Filters>
<ThresholdFilter level="ERROR" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
这个过滤器有三个参数,第一个是level,就是要过滤的隔离级别,我这里填了ERROR,也就是我只要ERROR的消息。
第二个参数是向上匹配,这里的向上是按照日志的隔离级别来算的
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL
有了这个基础就可以做出作业了
最后的配置文件就是这样的。
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">logs</property>
<property name="FILE_NAME">mylog</property>
<!-- 当日志大于大于这个大小的时候,就打一个包 -->
<property name="FILE_SIZE">1MB</property>
</properties>
<Appenders>
<!-- 控制台输出-->
<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<!-- 过滤器 onMatch是向上匹配 ,onMismatch是向下匹配 NEUTRAL是true DENY是false-->
<!-- <Filters>-->
<!-- <ThresholdFilter level="DEBUG" onMatch="NEUTRAL" onMismatch="DENY"/>-->
<!-- <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>-->
<!-- </Filters>-->
</Console>
<RollingRandomAccessFile name="MyFileFATAL"
fileName="${LOG_HOME}/FATAL/FATAL.log"
filePattern="${LOG_HOME}/FATAL/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}FATAL-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<DefaultRolloverStrategy max="20" />
<Filters>
<ThresholdFilter level="FATAL" onMatch="NEUTRAL" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="MyFileERROR"
fileName="${LOG_HOME}/ERROR/ERROR.log"
filePattern="${LOG_HOME}/ERROR/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}ERROR-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<DefaultRolloverStrategy max="20" />
<Filters>
<ThresholdFilter level="ERROR" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="MyFileWARN"
fileName="${LOG_HOME}/WARN/WARN.log"
filePattern="${LOG_HOME}/WARN/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}WARN-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="WARN" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="MyFileINFO"
fileName="${LOG_HOME}/INFO/INFO.log"
filePattern="${LOG_HOME}/INFO/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}INFO-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="MyFileDEBUG"
fileName="${LOG_HOME}/DEBUG/DEBUG.log"
filePattern="${LOG_HOME}/DEBUG/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}DEBUG-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<Filters>
<ThresholdFilter level="DEBUG" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="MyFileTRACE"
fileName="${LOG_HOME}/TRACE/TRACE.log"
filePattern="${LOG_HOME}/TRACE/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}TRACE-%i.zip">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
<!-- 触发打包文件 时间和大小-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="${FILE_SIZE}" />
</Policies>
<DefaultRolloverStrategy max="20" />
<Filters>
<ThresholdFilter level="TRACE" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="MyFileFATAL"/>
<AppenderRef ref="MyFileERROR"/>
<AppenderRef ref="MyFileWARN"/>
<AppenderRef ref="MyFileINFO"/>
<AppenderRef ref="MyFileDEBUG"/>
<AppenderRef ref="MyFileTRACE"/>
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
效果如下。
每一种隔离级别都创建一个文件夹,并且这个文件夹里的日志都是这个隔离级别的日志。