创建记录器时Log4j 2挂起

时间:2016-03-13 13:13:35

标签: java log4j2

我有这个简单的程序:

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

3 个答案:

答案 0 :(得分:5)

你有比你需要的更多的罐子。特别是,您的应用程序不使用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,否则你不应该包含它们。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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