Java:log4j初始化错误

我是使用log4j包的新手,我没有看到错误:这是一个非常简单直接的代码示例:

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestLogger { private static Logger logger; public static void main(String[] args) { logger = LogManager.getLogger(TestLogger.class); logger.info("Hello"); } } 

当我尝试编译时,我收到此错误:

位于my.package.logging.TestLogger.main的org.apache.logging.log4j.LogManager.getLogger(LogManager.java:129)中的线程“main”java.lang.NullPointerException中的exception(TestLogger.java:15)

我想知道它究竟是什么意思……

你能在这帮吗?

你很可能错过了一个依赖项。 如果您只在类路径中包含log4j-api-2.0-beta1.jar文件,则这很容易重现。

如果您下载了二进制发行版 , log4j-core-2.0-beta1.jar在类路径中包含log4j-core-2.0-beta1.jar 。 如果您使用Maven,请将其放在您的pom.xml

   org.apache.logging.log4j log4j-api 2.0-beta1   org.apache.logging.log4j log4j-core 2.0-beta1  

以下适用于我(更新:现在与您的原始发布相同,但显示导入)

 import org.apache.log4j.LogManager; import org.apache.log4j.Logger; public class TestLogger { private static Logger logger; public static void main(String[] args) { logger = LogManager.getLogger(TestLogger.class); logger.info("Hello"); } } 

如果您已经创建了log4j配置,否则您将收到可怕的错误:

 log4j:WARN No appenders could be found for logger (TestLogger). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

我通过避免log4j2 jar的类路径上的多个副本来解决这个问题。

NPE发生在LogManager的第129行。 (return statement = 129行)

 /** * Return a Logger with the specified name. * * @param name The logger name. * @return The Logger. */ public static Logger getLogger(String name) { return factory.getContext(LogManager.class.getName(), null, false).getLogger(name); } 

问题似乎是,工厂(LoggerContextFactory)为null =未初始化。 初始化发生在LogManager类中的静态初始化程序块中。

我的假设是,当类路径上有多个LogManager时,初始化会失效。

在我的项目(使用eclipse开发的web应用程序)中,我在WEB-INF / lib中使用了jar, 通过依赖项引用到另一个项目。 在我的案例中,使所有引用指向相同的jar解决了这个问题。