• Java日志门面框架--SLF4J


    1.日志门面概述

    1.1 门面模式(外观模式)

    门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。门面模式相当于一个统一的接口,不论外部对象是怎么样的,与子系统通信都是用的统一的接口(门面模式)。

    1.2 日志门面

    日志框架也需要一个统一的接口,与代码整合,这样切换日志框架的时候就可以不修改代码内容。

    1.3 常见的日志框架及日志门面

    常见的日志实现:JUL、log4j、logback、log4j2
    常见的门面框架:JCL、slf4j
    出现顺序:log4j–>JUL–>JCL–>slf4j–>logback–>log4j2

    2.SLF4J简介

    简单日志门面(Simple Logging Facade For Java)主要是为了给Java日志访问提供了一套标准、规范的API框架,其主要意义在于提供接口。对于一般的项目而言,日志框架会选择SLF4J-API作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。
    
    • 1

    2.1 案例

    maven配置

    	<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    public class LogDemoCtroller {
        /**
         * slf4j 对应5个日志级别划分
         * trace:日志追踪信息
         * debug:日志详细信息
         * info:日志关键信息
         * warn:日志警告信息
         * error:日志错误信息
         * 没有集成其他日志框架的话,使用的就是自带的slf4j-simple
         * 但是slf4j-simple也是要以依赖的形式导入
         */
        @Test
            public void test() {
               Logger logger = LoggerFactory.getLogger(LogDemoCtroller.class);
               	logger.trace("trace信息");
               	logger.debug("debug信息");
               	logger.info("info信息");
               	logger.warn("warn信息");
                logger.error("error信息");
                //用占位符打印含有变量的信息
                String name = "zs";
            	int age = 23;
            	logger.info("学生信息-姓名:{},年龄:{}",name,age);
            	//打印异常信息
            	 try {
                	Class.forName("aaa");
            	}catch (ClassNotFoundException e){
                	logger.info("具体错误是:"+e);
            	}
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2.2 SLF4J与日志集成的分类

    集成其他日志实现之前
    SLF4J日志门面,共有3种情況对日志实现进行绑定
    1)官方提供的slf4j-simple,在使用的时候也要导入依赖,进行自动绑定到slf4j-门面上。
    如果不导入,slf4j核心依赖是不提供任何实现的。
    2)logback和simple (包括nop:表示不记录日志,禁止所有日志的打印)
    都是出现slf4j门面之后的日志实现, 所以API完全遵循SLF4J进行的设计,那么我们只需要导入想要使用的日志实现依赖,即可与slf4j无缝衔接。
    3)log4j和JUL
    都是slf4j门面之前的日志实现,所以不遵循slf4j进行设置,需要通过适配器桥接的技术,完成与日志门面的衔接。下图的Adaption layer即适配器桥接。
    在这里插入图片描述

    2.3 SLF4J与日志框架集成

    2.3.1 SLF4J与logback日志框架集成

    1)引入maven依赖

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

    2)代码

    mport org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SLF4JTest {
        @Test
        public void test() {
            Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
            logger.trace("trace信息");
            logger.debug("debug信息");
            logger.info("info信息");
            logger.warn("warn信息");
            logger.error("error信息");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.3.2 SLF4J与log4j日志框架集成

    1)引入依赖

     		<!--log4j适配器依赖-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.25</version>
            </dependency>
            <!--log4j框架-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2)代码

    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SLF4JTest {
        @Test
        public void test() {
            Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
            logger.trace("trace信息");
            logger.debug("debug信息");
            logger.info("info信息");
            logger.warn("warn信息");
            logger.error("error信息");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3)log4j配置文件

    log4j.rootLogger=trace,console
    #配置自定义logger
    #log4j.logger.com.tang.project1.test=info,file
    ##配置appender输出方式 输出到控制台
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    ##配置输出的格式
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d [%x] - %m%n
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    slf4j要是同时集成了多个日志框架的,哪个maven依赖先导入就集成哪个日志框架
    在这里插入图片描述

    2.3.3 日志框架的升级—>从log4j到slf4j+logback

    在不改变源码的情况下升级日志框架,需要使用到桥接器。桥接器的使用步骤为:
    1、去除之前旧的日志框架依赖:将pom.xml里引入的log4j框架依赖注释。

     		<!--log4j框架-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、添加slf4j相关的桥接组件,桥接器加入后代码编译就不报错了。

     <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>log4j-over-slf4j</artifactId>
         <version>1.7.25</version>
     </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.代码:使用桥接器以后,虽然引入的代码看起来还是log4j的,其实是slf4j门面+logback的实现,这就是桥接器的效果。

    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    import org.junit.jupiter.api.Test;
    public class SLF4JTest {
        @Test
        public void test() {
            Logger logger = LogManager.getLogger(SLF4JTest.class);
            logger.trace("trace信息");
            logger.debug("debug信息");
            logger.info("info信息");
            logger.warn("warn信息");
            logger.error("error信息");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    一篇文章教会你Linux中的“启动类故障修复”和root密码修改
    结构体 2.招聘
    注解、AOP
    一个完整的Flutter应用
    盘点那些具有特色的写作软件
    redis集群监控
    DateUtil工具类记录
    js中map和set的区别
    python集合
    ardupilot开发 --- 通信链路 篇
  • 原文地址:https://blog.csdn.net/trh_csdn/article/details/127098291