SpringBoot - 日志框架Log4j2的整合教程1(基本用法、替换Logback)
一、基本用法
1,基本介绍
(1)市面上常见的日志框架有很多。通常情况下,日志是由一个抽象层+实现层的组合来搭建的,而用户通常来说不应该直接使用具体的日志实现类,应该使用日志的抽象层。使用接口的好处是当项目需要更换日志框架的时候,只需要更换 jar 和配置,不需要更改相关 java 代码。
(1)抽象层:JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging
(2)实现层:Log4j 、JUL(java.util.logging)、Log4j2、Logback
(2)实现层:Log4j 、JUL(java.util.logging)、Log4j2、Logback
- Log4j 是 apache 实现的一个开源日志组件
- Logback 同样是由 Log4j 的作者设计完成的,拥有更好的特性,用来取代 Log4j 的一个日志框架,是 SLF4j 的原生实现
- Log4j2 已经不仅仅是 Log4j 的一个升级版本了,它从头到尾都被重写了。由于使用了 LMAX Disruptor 技术(无锁异步),使得日志的吞吐量、性能比 log4j 1.x 提高 10 倍,并解决了一些死锁的 bug,而且配置更加简单灵活。
(2)SpringBoot 默认选择的是 SLF4J + Logback 的组合,具体用法可以参考我之前写的文章(点击查看)。在实际项目中我们可以整合 Log4j2 来代替原来的 Logback(形成 SLF4J + Log4j2 组合)。采用 Log4j2 有如下几个优点:
- 相比与其他的日志系统,log4j2 丢数据的情况少;
- 采用 disruptor 技术,在多线程环境下,性能高于 logback 等 10 倍以上(无论在同步日志模式还是异步日志模式下,在所有日志框架中 log4j2 性能都是最佳的)
- 利用 jdk1.5 并发的特性,减少了死锁的发生;
关于 Disruptor 更详细的介绍和用法,可以参考我之前写的文章:
2,整合 Log4j2
(1)我们只需要编辑项目的 pom.xml 文件,引入 log4j2 依赖即可。
注意:如项目中有导入 spring-boot-starter-web 依赖包,记得去掉 spring 自带的日志依赖 spring-boot-starter-logging。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 去掉springboot默认日志配置 --> <exclusions> <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>
(2)Java 代码这边同样通过 SLF4j 来操作日志,这个同之前使用 Logback 时是一样的:
@RestController public class HelloController { Logger logger = LoggerFactory.getLogger(getClass()); @GetMapping("/test") public void test(){ logger.trace("Trace 日志..."); logger.debug("Debug 日志..."); logger.info("Info 日志..."); logger.warn("Warn 日志..."); logger.error("Error 日志..."); } }

(3)如果项目有使用 Lombok 的话,直接使用 @Slf4j 注解可以省去从日志工厂生成日志对象这一步,直接进行日志记录。下面代码的效果同上面是一样的:
@RestController @Slf4j public class HelloController { @GetMapping("/test") public void test(){ log.trace("Trace 日志..."); log.debug("Debug 日志..."); log.info("Info 日志..."); log.warn("Warn 日志..."); log.error("Error 日志..."); } }