发布时间:2025-02-01
浏览次数:0
单击上面的蓝色“,选择”设置为占星术”
学最好的别人,做最好的我们
作者|空的
来源|
前言
您是否曾经在日志中遇到过日志,但是您无法打印它?
您是否曾经遇到过配置,但是启动时,log4j被提示是错误的?
如以下内容:
log4j:WARN No appenders could be found for logger (org.example.App).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
您是否曾经在SLF4J中遇到过这样的错误?
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/jiang/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/jiang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.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 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
复制代码
您是否遇到了Dubbo日志的异常打印?
您是否曾经遇到过无法打印JPA/ SQL日志的情况?
您是否曾经遇到过在复杂项目中无法打印许多内部日志的情况?
您是否曾经遇到过项目,日志文件已被打印到多个,.out和其他文件?
您是否遇到过各种日志配置问题...
日志框架冲突
以上问题基本上是由多个日志框架的共存或配置误差引起的。
那么为什么共存或冲突呢?
通常以下原因:
该项目手动引用各种日志框架示例的袋子,log4j ////jboss-/jcl,
软件包管理工具()的传输依赖性是由Dubbo的依赖性引起的,但Dubbo取决于它,但取决于Log4J。此时
同一日志框架的多次交换
Java中的各种日志框架
在正式引入冲突和解决方案之前,您需要简要讨论Java中的各种日志框架:
Java中的日志框架分为两种类型,分别是日志抽象/外观和日志实现。
对数抽象/立面
日志抽象/外观,它们对特定的日志打印不承担任何责任,例如输出到文件,配置日志内容格式等。它们只是一组日志抽象,定义了一组统一的日志打印标准集,例如对象,级别,级别对象。
SLF4J(用于Java)和JCL()的两个日志框架是Java中最主流的日志。还有一个JBOSS-,主要用于JBOSS系列软件,例如。就像JCL多年来从未更新(最后更新时间仍然14年)一样,最建议的是SLF4J。
日志实现
Java的日志实现框架,主流框架如下:
log4j-(旧日志框架intellij idea产品学习手册,但多年来没有更新,新版本是)
- (新版本的log4j,当前的异步IO性能是最强的,配置相对简单)
-QOS(SLF4J是该公司的产物)
Jul(Java.util。)-jdk构建-in
在程序中,您可以直接使用日志框架,也可以使用日志抽象+日志来实现计划。但是,它通常是用日志抽象+日志实现的,该+日志更灵活,更简单地适应。
目前,最主流的解决方案是SLF4J+/,但是如果它是JBOSS系列的产物,则毕竟可能是JBoss-,毕竟是Pro-son。在诸如JPA/之类的框架中,JBoss-是内置的。
+ Dubbo日志框架冲突的示例
例如,最常见的传输依赖性引起的共存冲突:
例如,我有一个“干净”的bot项目,它是如此干净,只有一个启动依赖性。目前,我想整合Dubbo并将其用作注册中心。目前,我的依赖性配置是:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.9version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-zookeeperartifactId>
<version>2.7.9version>
dependency>
dependencies>
启动最新的教程建议以查看以下内容:
现在启动此启动项目,您会发现许多红色错误:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/jiang/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/jiang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.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 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
----------------------------------人肉分割线----------------------------------------
log4j:WARN No appenders could be found for logger (org.apache.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
从错误提示下,错误内容分为两个部分:
SLF4J报告了一个错误,提示找到多个SLF4J的日志绑定
log4j报告错误,提示log4j无配置
之所以出现此错误,是因为Dubbo的传输依赖性包含Log4J,但是-boot的默认配置为SLF4J+。依靠Dubbo相关的软件包后,现在有/jcl( - )/log4j/jul-slf4j-log4j-在项目中同时在项目中
查看依赖项图:
目前,这很混乱。 SLF4J-LOG4J是log4j的SLF4J实现。角色是调用SLF4J API时使用Log4J输出; log4j-to-slf4j的作用是将log4j的实现替换为log4j。这不是死周期。
而且也存在SLF4J默认值的抽象,SLF4J-LOG4J也实现了SLF4J的抽象。该项目在项目中有两组SLF4J实现。那么,使用SLF4J接口打印时将使用哪一个?
答案是“第一个”,这是已加载的SLF4J的第一个实现类,但是依赖加载顺序的日志配置顺序非常不可靠
如果要正常使用日志,请让此项目中的所有框架正常打印日志,必须统一日志框架。但是,这里的统一不是被强制修改,而是在“适应/过境”方法中。
尽管项目中有SLF4J-LOG4J的配置,但此配置是适应的,我们的依赖性仅为。实际上,这种过境是无效的。但这是有效的,并且是启动项目的默认配置。这次,选择项目的统一日志框架。
现在,项目中有log4j(1)软件包,并且在开始时报告了log4j的错误,表明某些代码将log4j的API调用。但是我们不想使用log4j,因此我们需要首先解决log4j的问题。
因为有对Log4J代码的引用,因此直接删除Log4j是不可行的。 SLF4J提供了一个log4j-over-SLF4J软件包。该软件包对接口类(相等)的一部分进行了代码,并将同时修改为SLF4J。
因此,请依靠log4j(传输)依赖项,并同时引用log4j-over-SLF4J,它解决了该log4j的问题。
现在,让我们修改POM中的依赖项(请参阅依赖项可以使用Maven的命令,或者Maven随附Idea或插件,例如Maven)
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-zookeeperartifactId>
<version>2.7.9version>
<scope>compilescope>
<exclusions>
<exclusion>
<artifactId>log4jartifactId>
<groupId>log4jgroupId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>log4j-over-slf4jartifactId>
<version>1.7.30version>
dependency>
解决LOG4J的问题后,SLF4J仍然存在两个问题,这更容易解决此问题。由于我们计划使用,因此我们只需要排除/删除SLF4J-LOG4J的依赖性。
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-zookeeperartifactId>
<version>2.7.9version>
<scope>compilescope>
<exclusions>
<exclusion>
<artifactId>log4jartifactId>
<groupId>log4jgroupId>
exclusion>
<exclusion>
<artifactId>slf4j-log4j12artifactId>
<groupId>org.slf4jgroupId>
exclusion>
exclusions>
dependency>
修改完成后,再次开始毫无疑问,解决问题很容易。
日志适应
例如,您想调整SLF4J以适应/转换。根据图表上的路径,您只需要引用log4j-slf4j-impl即可。
如果要调整/调整/转换为SLF4J,则只需要删除JCL软件包,然后引用JCL-over-SLF4J即可。
图片上的箭头上标有文本,这需要其他软件包才能进行转换。有些没有明显的文本,这些文本已在适应实现中构建。实际上,构建的实现将更加麻烦,因为如果遇到共存,则需要通过配置环境变量/配置附加属性来指定日志实现。
目前,SLF4J的核心框架是此图片的中心枢纽。只要它在SLF4J周围进行了调整/转换,就没有无法处理的冲突。
总结
解决日志框架/冲突的问题实际上非常简单。只要您遵循一些原则:
统一使用一组日志来实现
删除额外无用的日志依赖项
如果必须有一个必须共存的报价,请删除原始软件包并使用“ Over”软件包(Over -Type软件包来复制原始接口并重新实现它)
如果您不能结束intellij idea产品学习手册,请使用log抽象提供的指定方法,例如在jboss-中,您可以通过org.jboss指定特定的日志框架。环境变量
在项目中统一日志框架之后,无论是否使用该日志框架打印,唯一的日志框架最终会转向我们的交通/适应。
解决共存/冲突后,项目中只有一个日志框架。永远不会有各种各样的恶心,例如“无法播放日志”,“日志配置不会生效”,并且可以在下班后较早!
BAT等大厂Java面试经验总结
想获取 Java大厂面试题学习资料
扫下方二维码回复「BAT」就好了
回复 【加群】获取github掘金交流群
回复 【电子书】获取2020电子书教程
回复 【C】获取全套C语言学习知识手册
回复 【Java】获取java相关的视频教程和资料
回复 【爬虫】获取SpringCloud相关多的学习资料
回复 【Python】即可获得Python基础到进阶的学习教程
回复 【idea破解】即可获得intellij idea相关的破解教程
回复 【BAT】即可获得intellij idea相关的破解教程 关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!
回复[想法激活]以获取创意激活方法
回复[Java]获取与Java相关的视频教程和信息
回复[]获取相关学习材料
回复[]获得全套0个基本知识手册
回复[2020]获取相关的面试问题教程
回复[]加入终端研究与发展部相关技术交流小组
如有侵权请联系删除!
TAGS:
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码