Java Logger的子类

时间:2011-05-12 10:44:39

标签: java logging

要让C.run()使用自己的类记录器,我应该在B中添加公共/受保护方法getLogger()吗?

public abstract class A extends Thread {
    @Override
    public abstract void run();
}

public class B extends A {

    private static final Logger logger = Logger.getLogger(B.class.getName());

    @Override
    protected void run() {
        // do something

        logger.info("B");
    }
}

public class C extends B {
}

2 个答案:

答案 0 :(得分:12)

Logger理想情况下设置为Class级别。因此,如果C需要它自己的Logger,那么在C中声明它自己的Logger,例如

private static final Logger logger = Logger.getLogger(C.class.getName());

这样,当C运行一些代码时,它会记录到自己的Logger,当B运行时,它会记录到自己的Logger。您将能够清楚地看到哪个类以这种方式记录。

如果这不是你想要的,请用你想要实现的目标和原因扩展问题。

我不相信下面的代码是不是一个好主意(我总是希望实际运行代码的类是Logger)但它应该可以工作:

public abstract class A extends Thread {
    @Override
    public abstract void run();
    protected abstract Logger getLogger();
}

public class B extends A {

    private static final Logger logger = Logger.getLogger(B.class.getName());

    @Override
    public void run() {
        getLogger().info("B");
    }

    @Override
    protected Logger getLogger() {return logger;);  
}

public class C extends B {

    private static final Logger logger = Logger.getLogger(C.class.getName());

    @Override
    protected Logger getLogger() {return logger;);  
}

答案 1 :(得分:2)

您可以在基类中使用它:

protected Logger logger = Logger.getLogger(this.getClass().getName());

this.getClass()将使用子类名称初始化记录器。