你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

肝了,最全 Java 日志框架适配方案!

发布时间: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-在项目中同时在项目中

查看依赖项图:

intel技术手册_intellijidea_intellij idea产品学习手册

目前,这很混乱。 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>

修改完成后,再次开始毫无疑问,解决问题很容易。

日志适应

intel技术手册_intellijidea_intellij idea产品学习手册

例如,您想调整SLF4J以适应/转换。根据图表上的路径,您只需要引用log4j-slf4j-impl即可。

如果要调整/调整/转换为SLF4J,则只需要删除JCL软件包,然后引用JCL-over-SLF4J即可。

图片上的箭头上标有文本,这需要其他软件包才能进行转换。有些没有明显的文本,这些文本已在适应实现中构建。实际上,构建的实现将更加麻烦,因为如果遇到共存,则需要通过配置环境变量/配置附加属性来指定日志实现。

目前,SLF4J的核心框架是此图片的中心枢纽。只要它在SLF4J周围进行了调整/转换,就没有无法处理的冲突。

总结

解决日志框架/冲突的问题实际上非常简单。只要您遵循一些原则:

统一使用一组日志来实现

删除额外无用的日志依赖项

如果必须有一个必须共存的报价,请删除原始软件包并使用“ Over”软件包(Over -Type软件包来复制原始接口并重新实现它)

如果您不能结束intellij idea产品学习手册,请使用log抽象提供的指定方法,例如在jboss-中,您可以通过org.jboss指定特定的日志框架。环境变量

在项目中统一日志框架之后,无论是否使用该日志框架打印,唯一的日志框架最终会转向我们的交通/适应。

解决共存/冲突后,项目中只有一个日志框架。永远不会有各种各样的恶心,例如“无法播放日志”,“日志配置不会生效”,并且可以在下班后较早!

BAT等大厂Java面试经验总结

intellij idea产品学习手册_intellijidea_intel技术手册

想获取 Java大厂面试题学习资料

扫下方二维码回复BAT就好了


intellijidea_intel技术手册_intellij idea产品学习手册

回复 【加群】获取github掘金交流群

回复 【电子书】获取2020电子书教程

回复 【C】获取全套C语言学习知识手册

回复 【Java】获取java相关的视频教程和资料

回复 【爬虫】获取SpringCloud相关多的学习资料

回复 【Python】即可获得Python基础到进阶的学习教程

回复 【idea破解】即可获得intellij idea相关的破解教程

回复 BAT即可获得intellij idea相关的破解教程
关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!

intellij idea产品学习手册_intel技术手册_intellijidea

回复[想法激活]以获取创意激活方法

回复[Java]获取与Java相关的视频教程和信息

回复[]获取相关学习材料

回复[]获得全套0个基本知识手册

回复[2020]获取相关的面试问题教程

回复[]加入终端研究与发展部相关技术交流小组

如有侵权请联系删除!

13262879759

微信二维码