【发布时间】:2016-03-13 13:13:35
【问题描述】:
我有这个简单的程序:
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
【问题讨论】:
-
您可以尝试改用这条线吗?
LogManager.getContext().getLogger(getClass().getName()); -
我尝试过使用
LogManager.getContext().getLogger(Test.class.getName()),因为我在静态方法中,但问题仍然存在(堆栈跟踪中的第一次调用发生了变化,但后来还是一样)。 -
像这样初始化你的记录器怎么样?
private static final Logger logger = LogManager.getLogger(Test.class); -
请编辑您的问题以包含您的代码正在运行的所有 JAR(包括版本号)的完整列表。
-
您使用的是什么 JDK 版本?您是否启用了安全管理器。