我是使用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");
}
}
当我尝试编译时,我收到此错误:
线程“main”中的异常java.lang.NullPointerException at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:129)at my.package.logging.TestLogger.main(TestLogger.java:15)
我想知道它究竟是什么意思......
你能在这帮吗?
答案 0 :(得分:1)
以下适用于我(更新:现在与原始发布相同,但显示导入)
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.
答案 1 :(得分:1)
你很可能错过了一个依赖项。如果您只在类路径中包含log4j-api-2.0-beta1.jar
文件,则这很容易重现。
如果您下载了the binary distribution,请在类路径中同时包含log4j-core-2.0-beta1.jar
。如果您使用Maven,请将其放在pom.xml
:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-beta1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0-beta1</version>
</dependency>
答案 2 :(得分:1)
我通过避免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由对另一个项目的依赖项引用。 让所有参考指向相同的罐子在我的情况下解决了这个问题。