Java Logger的子类

Nic*_*las 9 java logging

要让C.run()使用自己的类记录器,我应该在B中添加一个public/protected方法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 {
}
Run Code Online (Sandbox Code Playgroud)

pla*_*nes 12

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

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

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


StK*_*ler 5

您可以在基类中使用它:

protected Logger logger = Logger.getLogger(this.getClass().getName());
Run Code Online (Sandbox Code Playgroud)

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

  • 我猜想使其成为非静态的问题是对象的每个实例都会进行此调用。我知道它将返回现有的记录器,但它仍然是在 java.util.Logger 类中执行额外的代码来查找每个新实例。 (3认同)
  • 这是行不通的。当您调用 logger.info("whatever") 时,格式化程序将打印声明“logger”的类名,而不是从“this.getClass().getName()”返回的类名,即使在“logger.getName()”时也是如此" 返回正确的值。 (2认同)