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

Pet*_*ter 3 java inheritance log4j

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

public class SuperClass
{
private static Logger               logger  = Logger.getLogger(SuperClass.class);
public void test()
{
    logger.info("test...");
}
}
Run Code Online (Sandbox Code Playgroud)

...

public class SubClassA extends SuperClass
{
private static Logger               logger  = Logger.getLogger(SubClassA.class);
}
Run Code Online (Sandbox Code Playgroud)

...

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();
}
}
Run Code Online (Sandbox Code Playgroud)

如何仅为SubclassA启用test()中的日志记录?

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

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

kan*_*kan 5

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

private static Logger               logger  = Logger.getLogger(SuperClass.class);
Run Code Online (Sandbox Code Playgroud)

使用:

private Logger               logger  = Logger.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

或者你可以使用两者:

private Logger               subLogger  = Logger.getLogger(getClass());
private static Logger        logger  = Logger.getLogger(SuperClass.class);
Run Code Online (Sandbox Code Playgroud)

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

if(logger.isInfoEnabled() || subLogger.isInfoEnabled())
{
...
}
Run Code Online (Sandbox Code Playgroud)

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