当前位置: > > > SpringBoot - 日志框架Log4j2的整合教程1(基本用法、替换Logback)

SpringBoot - 日志框架Log4j2的整合教程1(基本用法、替换Logback)

一、基本用法

1,基本介绍

(1)市面上常见的日志框架有很多。通常情况下,日志是由一个抽象层+实现层的组合来搭建的,而用户通常来说不应该直接使用具体的日志实现类,应该使用日志的抽象层。使用接口的好处是当项目需要更换日志框架的时候,只需要更换 jar 和配置,不需要更改相关 java 代码。
(1)抽象层JCLJakarta Commons Logging)、SLF4jSimple Logging Facade for Java)、jboss-logging
(2)实现层Log4j JULjava.util.logging)、Log4j2Logback
  • 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 日志...");
    }
}
评论0