您有没有遇到过配置日志但无法打印的情况?
您有没有遇到过logback配置和引导时出现log4j错误的情况?
按如下方式:
log4j:WARNNoappenderscouldbefoundforlogger(org.example.App).log4j:WARNPleaseinitializethelog4jsystemproperly.log4j:WARNeehttp://logging.apache.org/log4j/1.2/faq.html#noconfigformoreinfo.
有没有见过SLF4J这样的错误报告?
SLF4J:ClasspathcontainsmultipleSLF4Jbindings.SLF4J:基金会文件[jar:文件/C:/Users/jiang/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/SLF4J:Foundbindingin[jar:file:/C:/Users/jiang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30!/slf4j/impl/StaticLoggerBinder.class]SLF4J:Seehttp://www.slf4j.org/codes.html#multiple_bindingsforanexplanation.slf4j.org/Actualbindingisoftype复制代码[ch.qos.logback.class.util.ContextSelectorStaticBinder]
您有没有遇到过DUBBO日志打印错误?
您有没有遇到过无法打印MybatisSQL日志的情况?
您有没有遇到过JPA/HibernateSQL日志不能打印?
您有没有遇到过在复杂项目中,许多框架的内部日志不能打印?
您有没有遇到Tomcat工程、打印多个日志文件、catalina.out等文件?
您有没有遇到SpringBoot项目,日志文件有多份打印的问题?
您有没有遇到任何日志配置问题…
违反日志框架。
上述问题,基本上都是由多组日志记录框架共存或配置错误引起的。
所以,为什么会有共存和冲突呢?
通常有以下几个原因:
该项目为各种日志记录框架手动引用包,例如log4j/log4j2/logback/jboss-logging/jcl,等等。
包管理器的传递依赖(TransitiveDependencies)导致对dubbo的依赖,但dubbo依赖于zkclient,而可zkclient又依赖于log4j,此时如果您的项目中存在和使用了其他日志记录框架,则会产生多组共存。
同一日志框架同时存在多个版本。
各种日志框架在JAVA中。
您需要先简单介绍Java中的各种日志框架,然后再正式讨论冲突和解决:
日志框架在Java中分为两类,分别是日志抽象/外观和日志实现。
记录抽象/外观。
记录抽象/外观,它们不负责具体的日志打印,比如文件输出,日志内容格式配置等等。它们只是对日志进行了抽象,并定义了一套诸如Logger对象、Level对象等统一的日志打印标准。
两种日志框架slf4j(SimpleLoggingFacadeforJava)和jcl(ApacheCommonsLogging)是JAVA中日志的主流抽象。另外,jboss-logging也主要用于jboss系列软件,例如hibernate等。比如jcl,它已经有很多年没有更新了(上次更新还是14年),现在最推荐使用slf4j。
建议阅读:Java核心技术的最新指南。
实现日志。
主要有以下几种类型的Java日志实现框架:
log4j-Apache(老版本的日志框架,虽然很多年都没有更新,新版本是log4j2)
log4j2-Apache(新版本的log4j,目前具有最强的异步IO性能,并且配置简单)
Logback-QOS(slf4j是该公司的产品)
jul(java.util.logging)-内置jdk。
对于程序,可以直接使用日志框架,或者采用日志抽象+日志实现相结合的方案。但是通常使用日志抽象+日志来实现,这样更加灵活,适配更加简单。
当前的主流方案是slf4j+logback/log4j2,但如果是jboss系列的产品,还是可以使用jboss-logging的,毕竟是亲儿子。在JPA/Hibernate这样的框架中,jboss-logging是内置的。
一个SpringBoot+Dubbo日志框架冲突的例子。
例如,由传递依赖所引起的共存冲突是最常见的:
例如,我有一个“干净的”spring-boot项目,并且只有一个spring-boot-starter依赖,我希望在这个时候集成dubbo,并使用zookeeper作为注册表,在这个时候我的依赖配置为:
springframework.bootspring-boot-starterorg.apache.dubbodubbo-spring-boot-starter2.7.9org.dubbodubbo-registry-zookeeper2.7.9。
开始这个spring-boot项目后,会发现红色的错误列表:
SLF4J:ClasspathcontainsmultipleSLF4Jbindings.SLF4J:基金会文件[jar:文件/C:/Users/jiang/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/SLF4J:Foundbindingin[jar:file:/C:/Users/jiang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J:Seehttp://www.slf4j.o