日志门面和日志框架(门面SLF4J)

「爱情、让人受尽委屈。」 2023-10-07 22:38 119阅读 0赞

一、SLF4J简介

简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现交由其他日志框架,例如log4j2和logback等。当然slf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j2、logback等),中间使用桥接器完成桥接。所以我们可以得出SLF4J最重要的两个功能就是对于日志框架的绑定以及日志框架的桥接。

二、 桥接技术

通常,我们依赖的某些组件依赖于SLF4J以外的日志API。我们可能还假设这些组件在不久的将来不会切换到SLF4J。为了处理这种情况,SLF4J附带了几个桥接模块,这些模块会将对log4j,JCL和java.util.logging API的调用重定向为行为,就好像是对SLF4J API 进行的操作一样。

三、SLF4J核心jar包

  1. <dependency>
  2. <!--日志门面核心包 -->
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-api</artifactId>
  5. <version>1.7.32</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>日志实现框架</groupId>
  9. <artifactId>日志实现框架</artifactId>
  10. </dependency>

注:SLF4J依赖slf4j-api包和日志实现框架包,如果不导入任何日志实现框架的话,会报错

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation

四、入门案例

1. 日志级别

  1. public class Slf4jTest {
  2. /**
  3. * SLF4J对日志的级别划分:trace,debug,info,warn,error
  4. * trace:日志追踪信息
  5. * debug:日志详细信息
  6. * info:日志关键信息
  7. * warn:日志警告信息
  8. * error:日志错误信息
  9. */
  10. @Test
  11. public void test01(){
  12. Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
  13. logger.trace("trace:日志追踪信息");
  14. logger.debug("debug:日志详细信息");
  15. logger.info("info关键信息");
  16. logger.warn("warn:日志警告信息");
  17. logger.error("error:日志错误信息");
  18. }
  19. }

2. 日志动态信息

  1. /**
  2. * 动态信息
  3. */
  4. @Test
  5. public void test02(){
  6. Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
  7. String name="Jean";
  8. Integer age=18;
  9. logger.info("学生姓名:{},年龄{}",name,age);
  10. }

3. 日志记录异常信息

日志对于异常信息的处理:一般情况下,我们在开发中的异常信息,都是记录在控制台上(我们开发环境的一种日志打印方式)。我们会根据异常信息提取出有用的线索,来调试bug。

但是真实生产环境中(项目上线),对于服务器或者系统相关的问题。在控制台上其实也会提供相应的异常或者错误信息的输出。但是这种错误输出方式(输出的时间,位置,格式。。。)都是服务胸膛默认的。

我们可以通过日志技术,将异常以日志打印的方式,进行输出查看。输出的时间,位置(控制台,文件),格式,完全由我们决定输出。

  1. /**
  2. * 日志记录异常信息
  3. */
  4. @Test
  5. public void test03(){
  6. Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
  7. try{
  8. Integer.parseInt("123a");
  9. }catch (Exception e){
  10. //e是引用对象,不用用{}做占位符
  11. logger.info("具体信息是:",e);
  12. }
  13. }

五、SLF4J日志门面对日志进行集成的3种情况

1. 常见的日志框架及门面

日志实现框架:JUL,log4j,logback,log4j2

常见的日志门面:JCL,slf4j

出现顺序:log4j->JUL->JCL->slf4j->logback->log4j2

2. 日志集成的3种情况

  • 在没有绑定任何日志实现的基础之上,日志是不能绑定实现任何功能的
  • logback和simple(包括nop):都是slf4j时间线之后提供的日志实现,所以API完全遵循slf4j进行的设计。那么我们只需要导入想要使用的日志实现依赖,即可与slf4j无缝衔接。
  • log4j和JUL:都是slf4j门面时间线前面的日志实现,所以API不遵循slf4j进行设计。通过适配器桥接的基数,完成的域日志门面的衔接。

六、SLF4J集成logback日志实现框架

1. slf4j集成多个日志框架

slf4j集成多个日志框架会报警告。哪个先导入就使用哪个日志实现框架。所以我们在应用中仅仅需要一种日志实现框架。

SLF4J: Class path contains multiple SLF4J bindings.

2. slf4j集成logback日志实现框架

  1. <dependency>
  2. <groupId>ch.qos.logback</groupId>
  3. <artifactId>logback-classic</artifactId>
  4. <version>1.2.6</version>
  5. </dependency>

七、 SLF4J集成log4j日志框架

由于log4j是在slf4j之前出品的日志框架实现,所以并没有遵循slf4j的API规范。之前集成的logback,是在slf4j之后出品的日志框架实现,logback就是按照slf4j的标准指定的API,所以我们导入依赖就能用。

如果需要slf4j集成log4j,就需要绑定一个适配器,适配器就叫做slf4j-log4j12.

  1. <!--slf4j日志门面 -->
  2. <dependency>
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-api</artifactId>
  5. <version>1.7.25</version>
  6. </dependency>
  7. <!--slf4j集成log4j的适配器 -->
  8. <dependency>
  9. <groupId>org.slf4j</groupId>
  10. <artifactId>slf4j-log4j12</artifactId>
  11. <version>1.7.30</version>
  12. </dependency>
  13. <!--log4j日志实现 -->
  14. <dependency>
  15. <groupId>log4j</groupId>
  16. <artifactId>log4j</artifactId>
  17. <version>1.2.17</version>
  18. </dependency>

当然,log4j.properties配置文件依然需要。

八、SLF4J集成log4j2日志框架

1. slf4j集成log4j2步骤共4步

  1. 导入slf4j日志门面
  2. 导入log4j2的适配器
  3. 导入log4j2日志门面
  4. 导入log4j2日志实现


    org.slf4j
    slf4j-api
    1.7.32



    org.apache.logging.log4j
    log4j-slf4j-impl
    2.14.1


    org.apache.logging.log4j
    log4j-api
    2.14.1



    org.apache.logging.log4j
    log4j-core
    2.14.1

2. 集成原理

slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现。

3. log4j2.xml配置文件

log4j2同样是默认加载类路径(resources)下的log4j2.xml文件中的配置。

发表评论

表情:
评论列表 (有 0 条评论,119人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SLF4J日志框架

    SLF4J日志框架 概述 日志框架对于java开发者来说并不陌生,并且其作为线上产品分析bug的有力工具。 Java的简单日志门面( Simple