org.slf4j.Logger无法输出日志的BUG

场景

依赖

 <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.11</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
            <type>jar</type>
        </dependency>
。。。

代码

public class ApiTest {

    private final Logger logger = LoggerFactory.getLogger(ApiTest.class);

    @Test
    public void test(){
        logger.info("Lasse到此一游");
    }
}

不尽人意的结果:没有任何输出

网上找了一堆文章都无法解决,最后只能自己手撕源码了。

问题点

方法:org.slf4j.LoggerFactory.getILoggerFactory();

找错思路

可以看到我明明导入了logback-classic依赖,它却使用了slf4j-log4j12

又在网上搜索了找了一下有没有指定使用特定依赖包下的StaticLoggerBinder,结果无。

又想到是否根据依赖导入的顺序,当机立断去看哪个依赖导入了slf4j-log4j12

最后找到了是org.apache.zookeeper引用了slf4j-log4j12

解决方法

LoggerFactory是根据加载顺序指定使用哪个依赖下的StaticLoggerBinder的。

所以调整依赖的顺序。

将logback-classic顺序放到依赖的最上方

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.11</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
        </dependency>

结果查看

使用理想中的依赖

方法:org.slf4j.LoggerFactory.getILoggerFactory();

可以看到它用到了logback-classic下的StaticLoggerBinder类

控制台输出

总结

今后除了关注依赖冲突版本冲突还有多加一项依赖的加载顺序

当使用Slf4j(Simple Logging Facade for Java)记录日志时,通常会使用Logger接口。下面是一个使用org.slf4j.Logger的示例: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggerExample { private static final Logger logger = LoggerFactory.getLogger(LoggerExample.class); public static void main(String[] args) { // 记录不同级别的日志 logger.debug("This is a debug message"); logger.info("This is an info message"); logger.warn("This is a warning message"); logger.error("This is an error message"); // 使用占位符记录带参数的日志 String name = "John"; int age = 30; logger.info("User {} is {} years old", name, age); // 异常日志记录 try { int result = 10 / 0; } catch (Exception e) { logger.error("Error occurred", e); } } } ``` 在上面的示例中,首先我们导入了`org.slf4j.Logger`和`org.slf4j.LoggerFactory`类。然后,我们定义了一个静态的Logger实例,使用`LoggerFactory.getLogger()`方法来获取Logger对象,参数传入当前类的Class对象。接着,我们使用不同级别的日志方法(debug、info、warn和error)记录日志信息。可以通过配置文件来控制日志级别的输出。 在示例中,我们还演示了如何使用占位符来记录带有参数的日志。使用占位符可以方便地将变量值插入到日志消息中。 最后,我们还展示了如何记录异常日志。通过将异常对象作为参数传递给日志方法,可以记录异常的堆栈信息。 请注意,这只是一个简单的示例,实际使用时需要根据具体的项目进行配置和使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值