Slf4j日志绑定/日志桥接

原文链接:Slf4j日志绑定/日志桥接 – 编程屋

目录

1 前言

2 Slf4j

        2.1  使用slf4j日志的绑定流程

        2.2 日志框架绑定入门

        2.3 桥接旧的日志框架


1 前言

在上篇我们了解了JCL这样一个日志门面技术,不过JCL因为在底层已经将它可以配置的日志框架全部都定下来了。无法在衔接其他的日志框架,那么它就在2014年的时候被抛弃了。因为随着技术的发展,肯定会有越来越多优秀的日志框架,所以需要我们提供一个向上可以兼容老的日志试下,向下可以衔接新的日志框架的日志门面。由此而来,Slf4j就此诞生了。

简单日志门面技术SLF4j主要是为了给Java日志访问提供一套标准。规范的API框架,其主要意义是在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。当然slf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的日志实现框架(log4j,logback)中间使用桥接器作为桥接。

2 Slf4j

SLF4j作为日志门面技术主要提供两大功能:

1. 日志框架的绑定

2. 日志框架的桥接

2.1  使用slf4j日志的绑定流程

        1 添加slf4-api的依赖

        2 使用slf4j的API在项目中进行统一的日志记录

        3 绑定具体的日志实现框架

                1. 绑定已经实现了slf4j的日志框架,直接添加对应依赖

                2. 绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖

        4 slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)

以上是从官网截取的一张图,上面详细展示了slf4j作为日志门面时,如何衔接日志框架。

可以从三个部分来表示:

第一部分(红色框):当我们只引入了slf4j的api接口,并没有引入相关的日志依赖时,将不会进行日志输出。

第二部分(蓝色框):  蓝色框中的三个日志框架比slf4j出的时候较晚,所以已经自动适配slf4j,我们只需要引入相应的依赖就可以实现slf4j作为门面,选中框架作为框架作为日志输出方式。

第三部分(青色框):  青色框的两个日志依赖比slf4j出的时候较晚,所以不能直接引入该依赖,需要先引入相应的适配器,再引入依赖,才能够实现该功能。

注意:一个slf4j只能绑定一个日志框架,绑定多个之后会默认选择第一个日志框架。

2.2 日志框架绑定入门

引入slf4j日志门面和具体实现依赖

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

<!--slf4j内置的简单实现-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.5</version>
</dependency>

测试类:

public class SLF4JTest {

    public static final Logger LOGGER = LoggerFactory.getLogger(SLF4JTest.class);

    @Test
    public void test(){
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");


    }




}

测试结果:

 可见slf4j的日志默认输出级别为:info

除此之外,还可以使用占位符来输出日志信息:

String name = "啦啦啦";
Integer age = 14;
LOGGER.info("用户姓名和年龄分别为:{},{}",name,age);
try {
    int a = 1/0;
} catch (Exception e) {
    LOGGER.error("出现异常:",e);
}

 结果为:

2.3 桥接旧的日志框架

通常,在我们的项目中依赖了SLF4j以外的日志记录API。如果有一天,项目进行迭代升级,想要切换到slf4j的日志门面和另外一种日志框架,那么之前项目中所用到了日志记录需要全部进行改动吗? 其实是不用的,桥接解决的就是日志的遗留问题。

 当系统中存在存在之前的日志API,可以通过桥接转换到slf4的实现。

1 先去除老的日志框架的依赖

2 添加slf4提供的日志桥接组件

3为项目添加具体的SLF4j的具体实现

我们可以先用代码演示下:

步骤一:先用slf4j+log4j进行日志输出

相关依赖:

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

        <!--slf4j内置的简单实现-->
<!--        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>-->

        <!--绑定log4j需要先导入适配器-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.32</version>
        </dependency>

        <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>

配置文件:

log4j.rootLogger = trace,console
#指定控制台日志输出的appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
#指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n

测试类:

public class Log4jTest {

    public static final Logger LOGGER = Logger.getLogger(SLF4JTest.class);

    @Test
    public void test(){
        LOGGER.info("hello");
    }

}

测试结果正常输出:

步骤二:项目进行迭代升级,用lockback日志框架替代log4j(此时将log4j依赖注释掉,但项目会报错)

改动后依赖:

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

        <!--slf4j内置的简单实现-->
<!--        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>-->

        <!--绑定log4j需要先导入适配器-->
<!--        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.32</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>-->

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.7</version>
        </dependency>

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

之前项目已经报错:

步骤三:添加对应的桥接组件

        <!--配置log4j的桥接器-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>

就可以发现我们的测试可以正常进行输出了,并且采用的是logback的底层实现。

注意事项:

        1 . jcl-over-slf4j.jar 和 slf4j-jcl.jar不能同时部署,前一个jar文件会导致JCL将日志系统的选择委托给SLF4J,后一个jar文件将导致SLF4j将日志系统的选择委托给JCL,从而导致无限循环。

        2. log4j-over-slf4和slf4j-log12.加入不能同时出现

        3. jul-to-slf4j.jar和slf4j-jdk14.jar不能同时出现

        4. 所有的桥接只对Logger日志记录器有效,如果程序中调用了内部低配置类或者Appender,Filter等对象,将无法产生效果

原文链接:Slf4j日志绑定/日志桥接 – 编程屋

        

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是 SLF4J(Simple Logging Facade for Java)的日志输出警告信息,它表明在你的项目中存在多个 SLF4J日志实现绑定。这种情况下,SLF4J 将选择其中一个作为实际的绑定。 警告信息中列出了多个绑定(bindings),并指出了这些绑定所在的 jar 包路径。例如: - slf4j-simple-1.7.12.jar - slf4j-log4j12-1.7.30.jar - slf4j-jdk14-1.5.6.jar - com.springsource.slf4j.log4j-1.6.1.jar 警告还提供了一个链接(http://www.slf4j.org/codes.html#multiple_bindings),解释了为什么会发生多个绑定的情况。 根据警告信息中的 "Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]",SLF4J 实际上选择了 `org.slf4j.impl.SimpleLoggerFactory` 作为日志实现的绑定。 如果你想解决这个警告,可以考虑以下几个步骤: 1. 检查你的项目依赖关系,确保只有需要的 SLF4J 相关的库被包含在项目中。检查你的 Maven 或 Gradle 配置文件,并删除不必要的依赖项。 2. 如果你确实需要多个 SLF4J日志实现,可以选择保留一个并删除其他的实现。例如,如果你想要使用 log4j2 作为日志实现,可以排除其他绑定,只保留 slf4j-log4j12 的依赖。 3. 如果你的项目中使用了其他日志框架(如 logback 或 log4j),请确保只有一个日志框架的绑定被包含在项目中。 4. 如果你的项目中没有明确指定 SLF4J日志实现,可以尝试在项目的依赖中添加一个合适的日志实现库,例如 logback 或 log4j。 请根据你的具体情况和项目需求进行相应调整,以解决 SLF4J 的多重绑定问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值