log4j:如何在超类中为方法启用子类中的日志记录

时间:2011-11-14 14:55:09

标签: java inheritance log4j

我的超类方法中有一个日志语句。我想只在为SubClassA的Object调用该方法时才启用此语句。

public class SuperClass
{
private static Logger               logger  = Logger.getLogger(SuperClass.class);
public void test()
{
    logger.info("test...");
}
}

...

public class SubClassA extends SuperClass
{
private static Logger               logger  = Logger.getLogger(SubClassA.class);
}

...

public class SubClassB extends SuperClass
{
private static Logger               logger  = Logger.getLogger(SubClassB.class);
public static void main(String[] p_Args)
{
    SubClassA subClassA = new SubClassA();
    SubClassB subClassB = new SubClassB();
    subClassA.test();
    subClassB.test();
}
}

如何仅针对SubclassA启用test()的登录?

log4j.logger.SuperClass = info //为两个子类启用test()方法

log4j.logger.SubClassA = info //对test()方法没有任何作用

2 个答案:

答案 0 :(得分:5)

我不认为这是可能的,因为logger对类和继承一无所知。记录器名称是一个简单的文本名称,如“a.b.c.d”。也许你可以在超类中使用子类的类,即代替:

private static Logger               logger  = Logger.getLogger(SuperClass.class);

使用:

private Logger               logger  = Logger.getLogger(getClass());

或者您可以同时使用两者:

private Logger               subLogger  = Logger.getLogger(getClass());
private static Logger        logger  = Logger.getLogger(SuperClass.class);

然后你可以使用更复杂的逻辑:

if(logger.isInfoEnabled() || subLogger.isInfoEnabled())
{
...
}

但如果我是你,我不会使用这种魔法,因为记录应该尽可能简单(但不是更简单)。

答案 1 :(得分:0)

如果您只想在这个子类中启用日志记录,则应该将记录器(或名为one的标准包/类的附加记录器)定义为特定字符串(Logger.getLogger("SpecialSubClassALogger")并在SuperClass中使用它来记录。然后您可以使用log4j.logger.SpecialSubClassALogger=info