簡體   English   中英

創建記錄器時Log4j 2掛起

[英]Log4j 2 hangs when creating logger

我有這個簡單的程序:

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

您的罐子數量超出了需要。 特別是,您的應用程序未使用SLF4J,因此您無需包含它。 但是您還包括了log4j-slf4j,log4j-core和log4j-slf4j-impl。 Log4g-core是實際的Log4j 2實現。 log4j-to-slf4j是Log4j 2 API的實現,該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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM