java - 扩展 Log4j Logger 类时出现 NullPointerException

标签 java nullpointerexception log4j

我想向 Log4j 记录器添加一些简单的方法,以便在我的应用程序中使用。

尝试这样做:

public class Logger extends org.apache.log4j.Logger
{
    public Logger(Class type)
    {
        super(type.getName());
    }

    public void info(String format, Object... o)
    {
        info(String.format(format, o));
    }

    public void debug(String format, Object... o)
    {
        debug(String.format(format, o));
    }

    public void warn(String format, Object... o)
    {
        warn(String.format(format, o));
    }

    public void error(String format, Object... o)
    {
        error(String.format(format, o));
    }
}

我想我应该能够像这样使用它:

public class TmpTest
{
    public static void main(String[] args) throws Exception
    {
        // Note I'm not even using the special methods here
        new Logger(TmpTest.class).warn("Test");
    }
}

但是我得到了一个NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at org.apache.log4j.Category.warn(Category.java:1004)
    at no.nwn.productconfigurator.TmpTest.main(TmpTest.java:16)

我可以不这样做吗?仅当我使用 Logger 类的 getLogger 工厂方法时,是否缺少一些初始化?

如果我无法扩展 Logger 类,我该怎么做?


这可能与 log4j.xml 有关吗?我自己以前从未使用过这个,也没有自己编写过。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="true">
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <appender name="ProductConfigurator" class="org.apache.log4j.DailyRollingFileAppender">
      <!-- 
      <param name="File" value="logs/ProductConfigurator.log" />   
      -->
      <param name="File" value="/var/tomcat/logs/ProductConfigurator.log" />
      <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{yyyy-MMM-dd HH:mm:ss,SSS}. %5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <logger name="org.hibernate" additivity="false">
    <level value="warn" />
        <appender-ref ref="ProductConfigurator"/>
    </logger>
    <logger name="org.hibernate.type" additivity="false">
    <level value="warn" />
        <appender-ref ref="ProductConfigurator"/>
    </logger>
    <logger name="org.hibernate.SQL" additivity="false">
    <level value="warn" />
        <appender-ref ref="ProductConfigurator"/>
    </logger>
    <root>
        <!-- all|trace|debug|info|warn|error|fatal|no -->
        <priority value="info" />
        <appender-ref ref="ProductConfigurator"/>
    </root>
</log4j:configuration>

最佳答案

category.repository 字段为 null。看一下源代码:

public void warn(Object message) {
    if(repository.isDisabled( Level.WARN_INT))
       return;

    if(Level.WARN.isGreaterOrEqual(this.getEffectiveLevel()))
        forcedLog(FQCN, Level.WARN, message, null);
}

要正确初始化Logger,您应该使用LogManager:

public static void main(String[] args) throws Exception
{              
    LogManager.getLogger(TmpTest.class.getName(), new LoggerFactory() {

        @Override
        public Logger makeNewLoggerInstance(String name) {
            return new Logger(name);
        }
    }).warn("Test");
}

我使用自定义工厂实现来实例化您的记录器。并不是说创建记录器的经典方法 (Logger.getLogger(Class clazz)) 使用 LogManager:

static public Logger getLogger(Class clazz) {
    return LogManager.getLogger(clazz.getName());
}

如果您的项目没有特定的限制,我建议您使用 slf4j 。它提供了您期望的方法:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

关于java - 扩展 Log4j Logger 类时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15480266/

相关文章:

java - 关于带有测试自动化的 IntelliJ 项目结构的问题

java - Cassandra 性能相对于两个应用程序主机是不同的

java - JodaTime 中格式错误的时区

java - 在Java中使用MappedByteBuffer读取文件的每一行

java - 如何将数据库中可以为空的条目转换为字符串?

java - 什么是NullPointerException,我该如何解决?

java - 线程无缘无故给出 NullPointerException

java - 使用 log4j2 和 slf4j 没有控制台输出

java - java企业应用中的log4j问题

java - 如何使用 log4j2 只记录一个级别?