Java Log4j 2在创建记录器时挂起
我有一个简单的程序:Java Log4j 2在创建记录器时挂起,java,log4j2,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.o
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]
然后就挂了
如果我在没有调试器的情况下运行程序,它会打印:
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
你的罐子比你需要的多。特别是,您的应用程序没有使用SLF4J,因此不需要包含它。但您也包括了log4j-slf4j、log4j核心和log4j-slf4j-impl。Log4g核心是实际的log4j2实现。log4j-to-slf4j是log4j2api的一个实现,它将所有事件路由到slf4j。然后,log4j-slf4j-impl将请求路由回log4japi,循环将重新开始 类路径中不能同时包含log4j-to-slf4j和log4j-slf4j-impl jar。如果希望Log4j 2进行日志记录,则删除Log4j-to-slf4j 另外,示例应用程序不是web应用程序,因此类路径中不应该有Log4JWeb
最后,除非您真的想要所有可选组件,如flume、NoSQL和jmx,否则您不应该包含它们 显然你的类路径被污染了,这两个不能同时存在:
log4j-slf4j-impl-2.5.jar
log4j-to-slf4j-2.5.jar
同时使用Log4j 2 SLF4J绑定(Log4j-SLF4J-impl-2.0.jar)
使用SLF4J适配器(log4j-to-SLF4J-2.0.jar)时,不应
已尝试,因为这将导致事件在
SLF4J和Log4j 2
详细说明如下:
它对我有效-删除了log4j-to-slf4j-2.5.jar你能试着改用这行吗<代码>LogManager.getContext().getLogger(getClass().getName())我尝试使用
LogManager.getContext().getLogger(Test.class.getName())
,因为我使用的是静态方法,但问题仍然存在(堆栈跟踪中的第一个调用发生了变化,但随后又是相同的)。这样初始化日志程序怎么样<代码>私有静态最终记录器Logger=LogManager.getLogger(Test.class)代码>请编辑您的问题,以包含代码运行时使用的所有JAR(包括版本号)的完整列表。您使用的是哪个JDK版本?您是否启用了安全管理器。