创建记录器时Log4j 2挂起

我有这个简单的程序:

package myPackage; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class Test { private static Logger logger; public static void main(String[] args) throws Exception { System.out.println("Creating logger..."); logger = LogManager.getLogger(Test.class); System.out.println("Logger created."); logger.info("Hello world!"); } } 

如果我在调试器下运行程序,它会打印:

 Creating logger... 

然后挂起

如果我在没有调试器的情况下运行程序,它会打印:

 Exception in thread "main" java.lang.StackOverflowError at sun.reflect.Reflection.quickCheckMemberAccess(Reflection.java:84) at java.lang.reflect.Method.invoke(Method.java:489) at org.apache.logging.log4j.util.ReflectionUtil.getCallerClass(ReflectionUtil.java:128) at org.apache.logging.log4j.util.ReflectionUtil.getCallerClass(ReflectionUtil.java:205) at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:42) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:329) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:42) 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:48) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:329) [... more of the same] 

我使用Log4j 2版本2.5和SLF4J版本1.7.18。

编辑:这是我的课程路径:

 // JRE 1.8.0_74 // Log4j 2 log4j-1.2-api-2.5.jar log4j-1.2-api-2.5-javadoc.jar log4j-1.2-api-2.5-sources.jar log4j-api-2.5.jar log4j-api-2.5-javadoc.jar log4j-api-2.5-sources.jar log4j-core-2.5.jar log4j-core-2.5-javadoc.jar log4j-core-2.5-sources.jar log4j-core-2.5-tests.jar log4j-flume-ng-2.5.jar log4j-flume-ng-2.5-javadoc.jar log4j-flume-ng-2.5-sources.jar log4j-iostreams-2.5.jar log4j-iostreams-2.5-javadoc.jar log4j-iostreams-2.5-sources.jar log4j-jcl-2.5.jar log4j-jcl-2.5-javadoc.jar log4j-jcl-2.5-sources.jar log4j-jmx-gui-2.5.jar log4j-jmx-gui-2.5-javadoc.jar log4j-jmx-gui-2.5-sources.jar log4j-jul-2.5.jar log4j-jul-2.5-javadoc.jar log4j-jul-2.5-sources.jar log4j-nosql-2.5.jar log4j-nosql-2.5-javadoc.jar log4j-nosql-2.5-sources.jar log4j-slf4j-impl-2.5.jar log4j-slf4j-impl-2.5-javadoc.jar log4j-slf4j-impl-2.5-sources.jar log4j-taglib-2.5.jar log4j-taglib-2.5-javadoc.jar log4j-taglib-2.5-sources.jar log4j-to-slf4j-2.5.jar log4j-to-slf4j-2.5-javadoc.jar log4j-to-slf4j-2.5-sources.jar log4j-web-2.5.jar log4j-web-2.5-javadoc.jar log4j-web-2.5-sources.jar // SLF4J 1.7.18 slf4j-api-1.7.18.jar 

你有比你需要的更多的jar子。 特别是,您的应用程序不使用SLF4J,因此您不需要包含它。 但是你还包括log4j-slf4j,log4j-core和log4j-slf4j-impl。 Log4g-core是实际的Log4j 2实现。 log4j-to-slf4j是Log4j 2 API的一个实现,它将所有事件路由到SLF4J。 log4j-slf4j-impl然后将请求路由回Log4j api,循环将重新开始。

您不能在类路径中同时拥有log4j-to-slf4j和log4j-slf4j-impl jar。 如果您希望Log4j 2进行日志记录,请删除log4j-to-slf4j。

此外,您的示例应用程序不是Web应用程序,因此您不应该在类路径中使用log4j-web。

最后,除非你真的想要所有可选组件,如flume,no-sql和jmx,否则你不应该包含它们。

显然你的类路径被污染了,这两个不能同时存在:

 log4j-slf4j-impl-2.5.jar log4j-to-slf4j-2.5.jar 

https://logging.apache.org/log4j/2.0/log4j-slf4j-impl/index.html

不应尝试使用Log4j 2 SLF4J绑定(log4j-slf4j-impl-2.0.jar)和SLF4J适配器(log4j-to-slf4j-2.0.jar),因为它会导致事件在SLF4J之间无限制地路由和Log4j 2。

详细说明如下:

http://www.slf4j.org/legacy.html

它对我有用 – 删除了log4j-to-slf4j-2.5.jar