问题描述
因此,我尝试遵循 this 他们的网站用于将slf4j添加到log4j.并尝试使用此代码
public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(Main.class); logger.info("test"); }
并将以下内容添加到我的库
- log4j-api2.3.3.jar
- log4j-core-2.3.jar
- log4j-sl4j-impl-2.3.jar
- log4j-to-sl4j-2.3.jar
- slf4j-api-1.7.12.jar
当我尝试运行它时,我会收到以下错误
Exception in thread "main" java.lang.StackOverflowError at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936) at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:964) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:40) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:41) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)...
有什么想法我要去哪里?
推荐答案
您正在用log4j-slf4j-impl-2.3.jar和log4j-to-slf4j-2.3.jar.
创建一个呼叫环log4j-slf4j-impl-2.3.jar是将SLF4J调用到log4j的适配器的实现.
log4j-to-slf4j-2.3.jar正在将log4j调用直接发送回SLF4J. 删除此.
其他推荐答案
以防万一,如果您在类路径中有 logback ,也必须将其删除!
其他推荐答案
想法1:
上述答案有效.我的是一个多模块项目,log4j-to-slf4j-2.3.jar依赖性是通过其他项目的拉动.我不得不扫描每个项目,以找出正在为此提取的项目.我使用以下命令在项目级别进行操作.
gradlew common:dependencies --configuration runtime
common是项目的名称 configuration runtime - 您可以更改此操作以适合您的需求
想法2:
如果您使用的是具有多模块项目的春季.然后,您可以简单地在每个子标记的build.gradle或dependency.gradle
中添加以下配置configurations { all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' }
问题描述
So I have tried following this (non-maven implementation) and requirements in their web site for adding slf4j to log4j. and tried using this code
public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(Main.class); logger.info("test"); }
and added the following to my library
- log4j-api-2.3.jar
- log4j-core-2.3.jar
- log4j-sl4j-impl-2.3.jar
- log4j-to-sl4j-2.3.jar
- slf4j-api-1.7.12.jar
when I try running it I get the following error
Exception in thread "main" java.lang.StackOverflowError at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936) at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:964) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:40) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:41) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)...
Any idea where I am going wrong?
推荐答案
You're creating a call-loop with log4j-slf4j-impl-2.3.jar and log4j-to-slf4j-2.3.jar.
log4j-slf4j-impl-2.3.jar is the implementation of the adapter that sends slf4j calls to log4j.
log4j-to-slf4j-2.3.jar is sending log4j calls right back to slf4j. Remove this one.
其他推荐答案
Just in case, if you have logback in your classpath, it must be removed as well!
其他推荐答案
Idea 1:
The above answer works. Mine was a multi module project and the log4j-to-slf4j-2.3.jar dependency was being by pulled by a different project. I had to scan each project to figure which project was pulling in this. I used the following command to do at a project level.
gradlew common:dependencies --configuration runtime
common is the name of the project configuration runtime - you can change this to suit your need
Idea 2:
If you are using spring which has multi module projects. Then you can simply add the following config in every subproject's build.gradle or dependency.gradle
configurations { all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' }