springboot集成log4j2日志
Java 中比较常用的日志工具类,有 Log4j、SLF4j、Commons-logging(简称jcl)、Logback、Log4j2(Log4j 升级版)、Jdk Logging等。
Spring Boot 默认使用 Logback,但相比较而言,Log4j2 在性能上面会更好。下面描述在Spring Boot项目中如何使用Log4j2。
1 去除默认的logback依赖并导入log4j2、lombok依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 引入log4j2日志时需去掉默认的logback -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 导入日志管理log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2 在资源目录下新建log4j2.xml文件
可以创建多个文件适用在不同环境中,比如log4j2-local.xml、log4j2-prod.xml等
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<Properties>
<!-- 声明日志文件存储的目录 -->
<Property name="LOG_HOME">E:/logs/app/</Property>
<Property name="LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread][%class{36}:%line] - %msg%n"></Property>
</Properties>
<Appenders>
<!--输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- ERROR级别日志 -->
<RollingFile name="infoAppender" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/%d{yyyy-MM}/%d{yyyy-MM-dd}_info.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
</RollingFile>
<!-- ERROR级别日志 -->
<RollingFile name="errorAppender" fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/%d{yyyy-MM}/%d{yyyy-MM-dd}_error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="infoAppender"/>
<AppenderRef ref="errorAppender"/>
</Root>
</Loggers>
</configuration>
3 在配置文件配置log4j2文件的位置
logging.config = classpath:log4j2-local.xml
4 添加测试方法进行测试
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SpringbootTestExampleApplicationTests {
//创建日志对象
Logger logger = LogManager.getLogger(this.getClass());
@Test
void test() {
logger.info("我是info日志");
logger.warn("我是warn日志");
logger.error("我是error日志");
}
}
5 联合lombok,@Sl4j注解输出日志
import lombok.extern.slf4j.Slf4j;
...
@Slf4j
public class SpringbootTestExampleApplicationTests {
...
@Test
public void test2() {
log.info("天气真热啊");
log.error("天气真热啊");
}
}
6 日志占位符
当需要动态的输出日志及参数时,可以使用占位符 "{}"进行占位。可以写多个占位符,它会根据后面的参数进行位置匹配填充。log4j2和sl4j用法一样,参考如下:
logger.info("你的姓名是:{},年龄是:{}", "张三", 20);
log.info("你的姓名是:{},年龄是:{}", "张三", 20);