0
点赞
收藏
分享

微信扫一扫

Java日志系统04 ---- slf4j门面日志

像小强一样活着 2022-02-26 阅读 65
java

目录标题

前言

当前文章只是学习笔记,具体请点击超链接:视频

简介

Java中常用的日志有JUL、Log4j、logback、Log4j2。但不建议直接使用日志本身的API,因为如果每个日志的实现的功能相同但接口不一样,如果想要给项目切换日志框架就得改大量代码。阿里巴巴的Java开发手册规定,应该使用门面日志(Slf4j、JCL)。让门面日志去调用JUL、Log4j、logback、Log4j2日志的接口。
在这里插入图片描述

快速开始

Maven依赖

首先添加门面日志的依赖

<dependency>
 <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.27</version>
</dependency>

老规矩,添加一些辅助测试的插件与依赖

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>
<build>
 <plugins>
   <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.1</version>
     <configuration>
       <source>1.8</source>
       <target>1.8</target>
       <encoding>UTF-8</encoding>
     </configuration>
   </plugin>
 </plugins>
</build>

测试代码

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jTest {

  private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);

  @Test
  public void quickTest() {
    LOGGER.info("info message: name:{},age:{}", "zhangsan", 30);

    try {
      int n = 1 / 0;
    } catch (Exception e) {
      LOGGER.error("Custom Exception:", e);
    }
  }
}

按照之前JCL门面日志的使用经验,我们只添加了Slf4j门面日志依赖,没有添加具体实现日志的依赖,Slf4j应该会调用JDK自带的JUL。但很可惜,SLF4J并不会自动调用JUL,此时日志报错了,提示需要添加操作日志的依赖,并且给出了解决这问题的链接:
在这里插入图片描述
我们也可以打开slf4j的用户手册:
https://www.slf4j.org/manual.html
其中有一幅图,说明了,如果要使用Log4j或JUL去输出日志,需要添加适配器。而像logback这些出现时间比较晚的日志,遵循的slf4j接口的规范,所以不需要额外添加适配器。
在这里插入图片描述
现在我们测试使用JDK自带的日志jul,所以再添加一个Slf4j-jdk适配器

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.7.31</version>
</dependency>

再次运行测试代码,成功输出日志
在这里插入图片描述

Slf4j整合log4j

再新建一个Maven工程,导入依赖

<!-- slf4j门面日志 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.27</version>
</dependency>

<!-- 实现日志功能的框架 -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

<!-- 门面日志整合log4j的适配器 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.32</version>
</dependency>

resource目录下,添加log4j.properties配置文件

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

再次运行快速开始中的测试代码,可成功在控制台输出日志

Slf4j整合logback日志

logback日志简介

Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
官方网站:https://logback.qos.ch/index.html

Logback当前分为下面几个模块:

  • logback-core:其它两个模块的基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j。
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

Logback使用

新创建一个Maven工程,导入依赖日志依赖。此处省略了Junit单元测试与编译插件的代码,使用上面快速开始中的代码即可。这里不再重复:

<!-- 日志实现框架logback-core + 门面日志slf4j-api -->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

再次运行快速开始中的测试代码,可成功在控制台输出日志

注意导入logback-classic依赖后,不用导入logback-core和slf4j-api。因为logback-classic中包含了logback-core和slf4j-api
在这里插入图片描述

logback配置

logback会依次读取以下类型配置文件:

  • logback.groovy
  • logback-test.xml
  • logback.xml

如果均不存在会采用默认配置
(TODO,具体配置文件,有时间再记录)

Log4j项目升级成Logback+slf4j

假如项目使用了Log4j日志,也没有使用门面日志API,在项目里已经写了大量调用Log4j原生API的代码。现在想全面改用slf4j+Logback作日志框架,然后又不想修改以前写好的Log4j日志代码。这时,可以使用桥接器。
官方文档:
https://www.slf4j.org/legacy.html

假设旧项目的maven依赖只有一个log4j。

<dependencies>
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  </dependency>
</dependencies>

resource目录下,添加log4j.properties配置文件

# 指定RootLogger顶级父元素默认配置信息
# 默认配置信息包括两部分:指定日志级别=trace,使用的appender=console
log4j.rootLogger=trace,console
# 指定控制台日志输出appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 指定消息格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

假如旧项目的代码为:

import org.apache.log4j.Logger;
import org.junit.Test;

public class Slf4jTest {

  private static final Logger LOG4J_LOGGER = Logger.getLogger(Slf4jTest.class);

  @Test
  public void quickTest() {
    LOG4J_LOGGER.info("info message ---------- log4j");
  }
}

升级成slf4j+logback的具体操作是:

  • 添加logback-classic(包含了日志实现框架logback-core和门面日志slf4j-api)
  • 添加log4j到slf4j桥接器
  • 删除旧的log4j依赖
<dependencies>
  <!-- 日志实现框架logback-core + 门面日志slf4j-api -->
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  </dependency>
  <!-- log4j到slf4j桥接器 -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.32</version>
  </dependency>

  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  </dependency>
</dependencies>

添加测试代码,旧的log4j和新的logback日志可以同时运行

import org.apache.log4j.Logger;
import org.junit.Test;
import org.slf4j.LoggerFactory;

public class Slf4jTest {

  private static final Logger LOG4J_LOGGER = Logger.getLogger(Slf4jTest.class);
  private static final org.slf4j.Logger SLJ4F_LOGGER = LoggerFactory.getLogger(Slf4jTest.class);
  @Test
  public void quickTest() {
    LOG4J_LOGGER.info("info message ---------- log4j");
    SLJ4F_LOGGER.info("slf4j ========= info message");
  }
}
举报

相关推荐

0 条评论