欢迎访问本站,祝大家玩得愉快。

Logback不能输出日志

Java kany.wang 2102℃ 0评论

原因

最近线上的一个项目在运行的时候没有显示日志,然后本地的一直在显示,也就没有注意以为是服务器上的原因。

今天客户说有很多问题,这个时候就需要查询日志,我们服务器上是不是有问题。(小项目随便查询,随便造。o(∩_∩)o 哈哈)

然后开始了解为什么我的项目不能输出日志呢?我都使用了logback了,怎么就是不输出呢?

噼里啪啦网上根据“logback日志不输出”找了一波。然后说什么有冲突什么的。

我的pom配置如下:

<!--******** logback and slf4j ******** -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>${logback.version}</version>
</dependency>

一直这样使用都没有出错,我所有的项目都是这样配置的。
想着是不是我的logback.xml写的有点问题,网上找了一波结果还是不成。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{YY-mm-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="TRACE">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

然后自己写了一个测试类,参考第一个资料:

package test;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;

public class Test {
    private static final Logger logger = LoggerFactory.getLogger(Test.class.getCanonicalName());
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println( "Hello World!" );

        System.out.println("----> logback start");
        logger.trace("--> Hello trace.");
        logger.debug("--> Hello debug.");
        logger.info("--> Hello info.");
        logger.warn("--> Goodbye warn.");
        logger.error("--> Goodbye error.");
        System.out.println("----> logback end");

        //打印 Logback 内部状态
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);
    }

}

这个时候告诉我说,有异常了

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/lib/activemq-all-5.11.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/lib/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Hello World!
----> logback start
log4j:WARN No appenders could be found for logger (test.Test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
----> logback end
Exception in thread "main" java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
    at test.Test.main(Test.java:34)

好吧,我继续根据异常去寻找正确的答案。然后就找到第二个参考资料,然后下载各种jar包。然后很完美的没有解决。

开始了怀疑人生。

冷静下来,我们重新开始看错误输出日志:

开始划重点:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/lib/activemq-all-5.11.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/lib/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]

到这的时候大家发现了什么没有,根据后面列出的参考资料,咱们已经明确,这个就是slf4j和logback之间冲突了,没有中间桥梁的问题。
但是为什么你要给我初始化两次这个slf4j呢?
原来是我在使用active-mq的时候使用了

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>${activemq.version}</version>
</dependency>

不要问我为什么要这样做,我可能当时觉得比较酷,因为一个引用全部添加多完美、多舒服。然后就悲剧了。

看到吧,这个里面居然又slf4j的东西,好的删除掉试试:

Hello World!
----> logback start
【2018-07-04 18:02:24】- [main] DEBUG test.Test ---> Hello debug.
【2018-07-04 18:02:24】- [main] INFO  test.Test ---> Hello info.
【2018-07-04 18:02:24】- [main] WARN  test.Test ---> Goodbye warn.
【2018-07-04 18:02:24】- [main] ERROR test.Test ---> Goodbye error.
----> logback end

居然解决了,真神奇。

总结

不能因为省事而加入一个类似activemq-all这样的包,因为很多东西不一定用得上。
出错后一定要多看看输出的日志文档,我就是忽略了控制台的输出,走了这么多弯路。

写一篇文章以纪念浪费的几个小时。

参考资料

联系方式

  • 小伙伴群:J2EE技术交流

打赏

转载请注明:懒人屋 » Logback不能输出日志

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址