要让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 {
}
答案 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()
将使用子类名称初始化记录器。