我有这个简单的程序:
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
答案 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。
此处有详细解释:
答案 2 :(得分:0)
它对我有用 - 删除了log4j-to-slf4j-2.5.jar