提要:
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排除, 部署后解决
相关推荐
总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,同时利用Logback的高性能和丰富特性。通过正确配置这些组件,开发者可以轻松管理和优化Java...
然而,随着时间的推移,Log4j的某些设计决策和性能问题使得开发者转向了更新的解决方案,比如Logback。Log4j的配置相对复杂,但其灵活性使其在许多项目中仍然占有一席之地。 Commons-Logging是Apache基金会的一个...
Log4j和SLF4J(Simple Logging Facade for Java)是Java领域广泛使用的两个日志框架,它们有着各自的特点和用途。下面将详细阐述这两个框架以及它们在给定压缩包中的具体组件。 首先,Log4j是Apache软件基金会的一...
在项目中,当这个JAR文件与SLF4J API和Log4j JAR文件一起使用时,SLF4J的调用将被转发到Log4j进行实际的日志处理。 在配置Hibernate和Spring时,日志记录是非常必要的。Hibernate,作为一个流行的对象关系映射(ORM...
1. **稳定性与兼容性**:Log4j 1.2.15是一个稳定版本,修复了前一版本中的多个已知问题,确保了与其他系统的良好兼容性。 2. **配置灵活性**:通过配置文件(通常为log4j.properties或log4j.xml),开发者可以灵活...
而Log4j-SLF4J-Impl则是SLF4J的一个绑定,它使得我们可以在应用中使用SLF4J API,同时实际的日志输出由Log4j负责。这种设计使得更换日志框架变得简单,只需更改绑定即可。 二、SLF4J的工作机制 SLF4J通过定义一套...
它为各种日志实现提供了一个抽象层,使得开发者能够在运行时动态地选择具体使用的日志实现,例如Log4j、Java Util Logging (JUL)、Logback等。SLF4J的出现主要是为了解决Java日志API的碎片化问题,让应用的日志配置...
通过SLF4J,开发者可以轻松地切换不同的底层日志框架,如Logback或Log4j。 **转换包**: 由于Log4j和SLF4J是两个独立的日志框架,它们之间通常需要一个适配器或转换包来实现兼容。在这种情况下,转换包可能是指`slf...
Log4j是一款广泛使用的日志记录框架,尤其在Java应用程序中。它提供了强大的日志管理功能,包括控制日志级别、格式化输出、文件滚动、性能优化等。在这个压缩包中,我们找到了与Log4j相关的几个核心组件和一个配置...
`log4j-slf4j-impl`是将SLF4J的日志调用桥接到log4j的实现,而`log4j-to-slf4j`则是将log4j的API桥接到SLF4J,方便迁移至其他日志框架。 当`log4j-slf4j-impl`和`log4j-to-slf4j`同时存在时,会导致日志配置混乱,...
8. **依赖冲突**:检查是否存在其他日志框架(如Logback、java.util.logging)与Log4j之间的依赖冲突。这种情况下,日志可能会被其他框架接管。 9. **版本兼容性**:确认使用的Log4j版本与项目的其他组件兼容。有时...
总结来说,"apache-log4j-1.2.16.zip"是一个包含Log4j核心库的压缩包,配合"slf4j-log4j12-1.7.2.jar"适配器,可以在使用SLF4J API的同时利用Log4j进行日志记录。通过"log4j.properties"配置文件,可以定制化日志的...
然后,`slf4j-api-1.6.1.jar`是Simple Logging Facade for Java的API,它为各种日志框架提供了一个简单的抽象层,如Log4j、java.util.logging、logback等。SLF4J允许开发者在部署时选择合适的日志实现,只需将对应的...
`Logback`和`Log4j`都是广泛使用的日志框架,它们允许自定义日志格式和处理策略。 2. **SpringMVC返回报文脱敏**:`SpringMVC`是Spring框架的一个模块,主要用于构建Web应用。在响应报文时,如果包含了敏感信息(如...
它的主要目的是提供一种统一的API,让开发者可以在不修改代码的情况下,切换不同的日志实现,如Log4j、java.util.logging或logback。commons-logging通过简单的API调用,如`org.apache.commons.logging.LogFactory....
- Logback:由Log4j的主要开发者设计,比Log4j更快且更轻量级,提供了类似的功能。 - SLF4J(Simple Logging Facade for Java):一个日志抽象层,允许在运行时绑定不同的日志实现,包括Log4j。 7. **日志的最佳...
本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...
Log4j是一款广泛使用的日志记录框架,尤其在Java开发中极为常见。它是由Ceki Gülcü在2002年开发的,其版本 jakarta-log4j-1.2.8 提供了详细的文档。这个框架允许开发者以灵活的方式输出不同级别的日志信息,如...
同样,如果需要将log4j的API与log4j2的实现结合,可以使用`log4j-api.jar`和`log4j-to-slf4j.jar`。 总结来说,"log4j相关jar包"包含了多种日志解决方案,旨在提供灵活、高效的日志记录服务。SLF4J作为抽象层,提高...
- 配置文件:Log4j 使用`log4j2.xml`或`log4j2.json`作为配置文件,定义日志行为。例如,你可以设置日志级别(TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF),指定Appender(如Console, File, SMTP等)并定义...