一、log4j2介绍
二、log4j2安装
pom.xml 添加log4j2所需jar包依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.0</version>
</dependency>
log4j2.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
status属性:查看log4j的装配过程,值为OFF表示关闭,值为debug等日志级别为查看日志创建过程(正常情况下只有debug和trace级别日志显示)
monitorInterval : 配置文件更改后重新加载,不用重启应用,单位秒
-->
<configuration status="error">
<!--全局属性声明,方便后面使用${属性名称} 进行引用-->
<properties>
<!-- /代表的是盘符根目录, 还有诸如 .代表当前当前项目路径 ,我们也可以使用@ 名称@从pom.xml中动态获取这些值 -->
<property name="LOG_HOME">logs</property>
<property name="DEBUG_FILE_NAME">debug</property>
<property name="ERROR_FILE_NAME">error</property>
</properties>
<!--先定义所有的appender -->
<appenders>
<!--这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--
控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)
ThresholdFilter:指定追加器过滤日志的级别
level:设定级别
onmatch:匹配符合条件的日志输出
onMismatch:拒绝不符合条件
-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="[name] %d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,false适合临时测试用
append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
<File name="log" fileName="${LOG_HOME}/log4j2.log" append="false">
<PatternLayout pattern="[name] %d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
<!--<PatternLayout pattern="[log4j2_test] %-d{yyyy-MM-dd HH-mm-ss.SSS} [%-5p] %C:%L %m%n"/>-->
</File>
<!--添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 -->
<File name="ERROR" fileName="${LOG_HOME}/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[name] %d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFile" fileName="${LOG_HOME}/web.log"
filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">
<!--
间隔时间备份策略
modulate为true表示以0点为边界进行时间偏移计算,
例:每隔4个小时进行日志封存,当前时间为3点,那么1个小时后进行一次日志封存(将之前的日志放置到filePattern指定的封存位置)
interval:间隔时间(其单位有filePattern中-dd HH%d{yyyy-MM}的最小单位来决定,)
-->
<TimeBasedTriggeringPolicy modulate="true" interval="12"/>
<PatternLayout pattern="[name] %d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="5MB"/>
</RollingFile>
<!--<!–-->
<!--以大小为策略进行日志封存,%i用于记录封存文件的生成先后顺序(),.zip/.gz等指定压缩格式-->
<!--immediateFlush:log4j2接收到日志事件时,是否立即将日志刷到磁盘。默认为true。-->
<!--–>-->
<!--<RollingFile name="sizedRollFile" fileName="${LOG_HOME}/sizerollfile.log" immediateFlush="true"-->
<!--filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/sizerollfile-%d{yyyy-MM-dd HH}-%i.log.zip">-->
<!--<PatternLayout pattern="[log4j2-demo] %-d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c:%L %m%n"/>-->
<!--<!– 当有多个策略时,使用Policies 标签–>-->
<!--<Policies>-->
<!--<TimeBasedTriggeringPolicy />-->
<!--<!–基于大小的触发策略,size指定大小–>-->
<!--<SizeBasedTriggeringPolicy size="10 kB"/>-->
<!--</Policies>-->
<!--<Filters>-->
<!--<thresholdFilter level="debug" onmatch="ACCEPT" onMismatch="DENY"/>-->
<!--</Filters>-->
<!--<!–-->
<!--控制生成的封存文件数量的一种策略,max控制filePattern 中的%i ,不指定默认为7,-->
<!--(就是你只能看见7个封存的文件,多余的你可以理解为覆盖掉了)-->
<!--这虽然也是一种策略,但是放置在策略标签之外-->
<!--–>-->
<!--<DefaultRolloverStrategy max="20" />-->
<!--</RollingFile>-->
</appenders>
<!--定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>
log4j2测试类
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j2Test {
private static final Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
public static void main(String[] args) {
for(int i=0;i<3;i++){
// 记录trace级别的信息
logger.trace("log4j2 trace日志输出:This is trace message.");
// 记录debug级别的信息
logger.debug("log4j2 debug日志输出:This is debug message.");
// 记录info级别的信息
logger.info("log4j2 info日志输出:This is info message.");
// 记录warn级别的信息
logger.warn("log4j2 warn日志输出:This is warn message.");
// 记录error级别的信息
logger.error("log4j2 error日志输出:This is error message.");
// 记录fatal级别的信息
logger.fatal("log4j2 fatal日志输出:This is fatal message.");
}
}
}