log4J2和logback冲突和共存解决方法

项目场景:

一个在线编辑器调试打印日志功能,需要提供logback和log4j2不同日志框架的日志功能供使用方自由选择


问题描述

本来logback和log4j2的冲突是经常发生的事,这件事很烦说实话,以前总是草草了事,随便排除一下就解决了,也没多管他,毕竟一直觉得为了个日志功能花太多时间不值当。

但是最近要做一个后台低代码平台,搞过的人都知道,动作大各种引用模块框框一堆,TMD到处是冲突,就很烦头很大特别是日志冲突。

本来不想写这个,毕竟一搜全是各种排除,也没毛病,只是大家各自需要排除的包不一样,这也是大部分时候的正确选择。但是也有我碰到的这种需求,需要在编译时两种框架的包都能引用到不至于报错,但是实际部署时只要其中一种,避免日志框架的冲突。


原因分析:

冲突原因就不分析了,大家自行百度吧


解决方案:

 我们以使用log4j2不使用logback为例
 maven引用的时候加上 <scope>provided</scope>
 这个的作用就是在打包的时候不会将logback打入依赖包从而避免冲突
 但是能在编译阶段提供jar包 保证引用到logback的类能通过编译
       <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <scope>provided</scope>
        </dependency>

是不是很简单 本来到这里我以为就结束了 确实打包部署运行是没问题了 但是当我需要在本地idea调试时怎么也不行一直报冲突

Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/E:/xx/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
	at org.springframework.util.Assert.instanceCheckFailed(Assert.java:702)
	at org.springframework.util.Assert.isInstanceOf(Assert.java:621)
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:294)
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:118)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:232)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:213)

就发现provided没起作用,后面花了好长时间才查到原因原来是idea的设置问题。问题本身是个小问题但是没碰到过的还真的是很烦人,百度也基本很难查到这个问题的帖子,就很奇怪,所以我特意记录一下有需要的兄弟碰到的话能少走弯路。

在项目的启动配置里取消掉图中选项,不同版本的idea这个设置地方可能不一样自己找一找就行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SLF4J、log4jlogbackJava的三个不同的日志框架。SLF4J是Java的一个日志门面,它提供了一些通用的API,可以与不同的具体日志框架集成使用。log4j是一个具体的日志框架,它提供了丰富的功能和配置选项。logback则是由log4j的作者设计完成的一个日志框架,它拥有更好的特性,并且是SLF4J的原生实现。 区别如下: 1. SLF4J是一个日志门面,它只提供了一些通用的API,而不是具体的实现。它的作用是为了让开发人员可以在不同的日志框架之间进行切换和集成,而不需要修改代码。 2. log4j是一个具体的日志框架,它提供了丰富的功能和配置选项。log4j可以与SLF4J结合使用,需要提供一些对应的jar包。 3. logback是由log4j的作者设计完成的日志框架,它是SLF4J的原生实现。logback拥有更好的特性,并且可以完整地实现SLF4J的API。logback包括了三个模块:logback-core、logback-classic和logback-access,分别用于提供基础功能、改良版本以及与Servlet容器集成。 因此,SLF4J提供了通用的日志接口,log4j是其中一个具体的实现,而logback则是log4j的改良版本,同时也是SLF4J的原生实现。根据具体需求和偏好,开发人员可以选择使用其中的任意一个日志框架。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java日志框架SLF4J和log4j以及logback的联系和区别](https://blog.csdn.net/weixin_30241919/article/details/101487496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值