Java:log4j初始化错误

时间:2012-10-06 22:14:45

标签: java logging 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");

    }
}

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

  

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

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

你能在这帮吗?

3 个答案:

答案 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由对另一个项目的依赖项引用。 让所有参考指向相同的罐子在我的情况下解决了这个问题。