`

Log4j问题排查-log4j,logback到底用了哪个?

 
阅读更多

提要:

1..在某此编译后,日志莫名其妙的乱了。本来应该打印到locationservice.log下的,但是打印到了jboss_stdout.log下

2. slf4j,log4j,logback之间的关系式什么?

 

============== 解答==================================================

 

1.因为代码没有变过,怀疑是系统在在使用日志系统的时候出现问题,打印mvn tree,发现同时依赖了log4j、logback,那系统使用的日志系统到底是哪一个呢?

 

2.查看log相关代码,原来slf4j只是日志系统的API,只是接口,称之为日志框架,类似于JDBCDriver,具体实现由各个厂家提供,而slf4j日志框架的实现目前有两个,一个是LOG4J,一个是SLF4J.

 

3.那么如果系统里有两套日志系统时,会选择哪个系统呢?

    在代码里我们通常会使用    Logger logger = LoggerFactory.getLogger(this.getClass());

    来获取Logger,LoggerFactory是slf4j-api里的一个单例工厂类,最底层调用StaticLoggerBinder.getSingleton().getLoggerFactory()来获取实现类。

而StaticLoggerBinder则在各自的厂商中提供。

那么到底使用的是哪个StaticLoggerBinder呢,

  private final static void bind() {
    try {
      Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
      reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);
      // the next line does the binding
      StaticLoggerBinder.getSingleton();
      INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
      reportActualBinding(staticLoggerBinderPathSet);
      emitSubstituteLoggerWarning();
    } catch (NoClassDefFoundError ncde) {
}
....
}

        从bind的源代码可以看到 其实是随机加载的。

        回到我们的系统,到底是不是这个Binder作怪呢,搜索下StaticLoggerBinder类,发现在classpath下确实有两套。

        

 

          于是问题就清晰了

           在classpath下存在两个StaticLoggerBinder,应用启动后加载到logback的StaticLoggerBinder,于是使用了logback的Logger,但是由于我们默认配置的是Log4j,所以找不到logback的配置,于是默认打印到了STDOUT里。

        

 4.简单理了下调用的顺序图

 

 

5.最后的解决方法

   MAVEN:tree找到是依赖里有建议依赖了logback-classic的包,使用mvn排除, 部署后解决

ps:
启动日志里有这么一段


 
其实就是因为系统存在两个日志系统,slf4j不知道比较迷茫给出的警告
代码出自
  private static void reportMultipleBindingAmbiguity(Set staticLoggerBinderPathSet) {
    if (isAmbiguousStaticLoggerBinderPathSet(staticLoggerBinderPathSet)) {
      Util.report("Class path contains multiple SLF4J bindings.");
      Iterator iterator = staticLoggerBinderPathSet.iterator();
      while (iterator.hasNext()) {
        URL path = (URL) iterator.next();
        Util.report("Found binding in [" + path + "]");
      }
      Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
    }
  }
 
当系统检查到有多个Binder时就出在日志里打印警告了。
 
WEBX 写道
另,webx的教程里对日志系统有比较详细的解释
请移步http://openwebx.org/docs/logging.html
 
 
不过还有个问题,为啥以前好的呢?费解!
FINISH
  • 大小: 31.7 KB
  • 大小: 40 KB
  • 大小: 13.7 KB
分享到:
评论
1 楼 上凌九霄 2016-11-03  
厉害,厉害

相关推荐

    日志 log4j-slf4j+logback1.3.0

    总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,同时利用Logback的高性能和丰富特性。通过正确配置这些组件,开发者可以轻松管理和优化Java...

    slf4j+logback 于log4j+commons-logging大PK

    然而,随着时间的推移,Log4j的某些设计决策和性能问题使得开发者转向了更新的解决方案,比如Logback。Log4j的配置相对复杂,但其灵活性使其在许多项目中仍然占有一席之地。 Commons-Logging是Apache基金会的一个...

    log4j-2.11.2的jar包和日志门面slf4j的jar包

    Log4j和SLF4J(Simple Logging Facade for Java)是Java领域广泛使用的两个日志框架,它们有着各自的特点和用途。下面将详细阐述这两个框架以及它们在给定压缩包中的具体组件。 首先,Log4j是Apache软件基金会的一...

    log4j-1.2.17.jar、slf4j-api-1.7.21.jar、slf4j-log4j12-1.7.2.jar

    在项目中,当这个JAR文件与SLF4J API和Log4j JAR文件一起使用时,SLF4J的调用将被转发到Log4j进行实际的日志处理。 在配置Hibernate和Spring时,日志记录是非常必要的。Hibernate,作为一个流行的对象关系映射(ORM...

    log4j-1.2.15.jar

    1. **稳定性与兼容性**:Log4j 1.2.15是一个稳定版本,修复了前一版本中的多个已知问题,确保了与其他系统的良好兼容性。 2. **配置灵活性**:通过配置文件(通常为log4j.properties或log4j.xml),开发者可以灵活...

    log4j-slf4j-impl.zip

    而Log4j-SLF4J-Impl则是SLF4J的一个绑定,它使得我们可以在应用中使用SLF4J API,同时实际的日志输出由Log4j负责。这种设计使得更换日志框架变得简单,只需更改绑定即可。 二、SLF4J的工作机制 SLF4J通过定义一套...

    slf4j-api-1.7.7,slf4j-log4j12-1.7.7

    它为各种日志实现提供了一个抽象层,使得开发者能够在运行时动态地选择具体使用的日志实现,例如Log4j、Java Util Logging (JUL)、Logback等。SLF4J的出现主要是为了解决Java日志API的碎片化问题,让应用的日志配置...

    log4j-1.2.16.jar与slf4j-api-1.6.1.jar加个转换包和log4j.properties示例

    通过SLF4J,开发者可以轻松地切换不同的底层日志框架,如Logback或Log4j。 **转换包**: 由于Log4j和SLF4J是两个独立的日志框架,它们之间通常需要一个适配器或转换包来实现兼容。在这种情况下,转换包可能是指`slf...

    log4j开发jar包及log4j配置文件

    Log4j是一款广泛使用的日志记录框架,尤其在Java应用程序中。它提供了强大的日志管理功能,包括控制日志级别、格式化输出、文件滚动、性能优化等。在这个压缩包中,我们找到了与Log4j相关的几个核心组件和一个配置...

    SpringTestLog.rar

    `log4j-slf4j-impl`是将SLF4J的日志调用桥接到log4j的实现,而`log4j-to-slf4j`则是将log4j的API桥接到SLF4J,方便迁移至其他日志框架。 当`log4j-slf4j-impl`和`log4j-to-slf4j`同时存在时,会导致日志配置混乱,...

    logback1.2.3

    SLF4J是一个用于各种日志框架的抽象层,如logback、log4j等。它的目的是为每个项目提供一个简单而统一的API,开发者可以在不修改代码的情况下更换底层的日志实现。SLF4J的API接口定义了日志记录的基本操作,如`info...

    无法打出log4j日志的问题排查

    8. **依赖冲突**:检查是否存在其他日志框架(如Logback、java.util.logging)与Log4j之间的依赖冲突。这种情况下,日志可能会被其他框架接管。 9. **版本兼容性**:确认使用的Log4j版本与项目的其他组件兼容。有时...

    log4j所需jar包

    总结来说,"apache-log4j-1.2.16.zip"是一个包含Log4j核心库的压缩包,配合"slf4j-log4j12-1.7.2.jar"适配器,可以在使用SLF4J API的同时利用Log4j进行日志记录。通过"log4j.properties"配置文件,可以定制化日志的...

    log4j-1.2.15.jar+shiro-all-1.3.2.jar+slf4j-api-1.6.1.jar+slf4j-log4j12-1.6.1.jar

    然后,`slf4j-api-1.6.1.jar`是Simple Logging Facade for Java的API,它为各种日志框架提供了一个简单的抽象层,如Log4j、java.util.logging、logback等。SLF4J允许开发者在部署时选择合适的日志实现,只需将对应的...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    `Logback`和`Log4j`都是广泛使用的日志框架,它们允许自定义日志格式和处理策略。 2. **SpringMVC返回报文脱敏**:`SpringMVC`是Spring框架的一个模块,主要用于构建Web应用。在响应报文时,如果包含了敏感信息(如...

    Java日志学习一:Log4j和commons-logging的关系

    它的主要目的是提供一种统一的API,让开发者可以在不修改代码的情况下,切换不同的日志实现,如Log4j、java.util.logging或logback。commons-logging通过简单的API调用,如`org.apache.commons.logging.LogFactory....

    tomcat9 slf4j+log4j2 写日志.zip

    本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...

    apache-log4j

    - Logback:由Log4j的主要开发者设计,比Log4j更快且更轻量级,提供了类似的功能。 - SLF4J(Simple Logging Facade for Java):一个日志抽象层,允许在运行时绑定不同的日志实现,包括Log4j。 7. **日志的最佳...

    log4j简介(jakarta-log4j-1.2.8)

    Log4j是一款广泛使用的日志记录框架,尤其在Java开发中极为常见。它是由Ceki Gülcü在2002年开发的,其版本 jakarta-log4j-1.2.8 提供了详细的文档。这个框架允许开发者以灵活的方式输出不同级别的日志信息,如...

    log4j相关jar包

    同样,如果需要将log4j的API与log4j2的实现结合,可以使用`log4j-api.jar`和`log4j-to-slf4j.jar`。 总结来说,"log4j相关jar包"包含了多种日志解决方案,旨在提供灵活、高效的日志记录服务。SLF4J作为抽象层,提高...

Global site tag (gtag.js) - Google Analytics