Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子类中的Java记录器_Java_Logging - Fatal编程技术网

子类中的Java记录器

子类中的Java记录器,java,logging,Java,Logging,为了让C.run()使用它自己的类记录器,我应该在B中添加一个公共/受保护的方法getLogger() 好吧,伐木工人被理想地设置在班级级别。因此,如果C需要它自己的记录器,那么在C中声明它自己的记录器 private static final Logger logger = Logger.getLogger(C.class.getName()); 这样,当C运行一些代码时,它会记录到自己的记录器,当B运行代码时,它会记录到自己的记录器。您将能够清楚地看到哪个类以这种方式记录了什么 如果这不是

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


好吧,伐木工人被理想地设置在班级级别。因此,如果C需要它自己的记录器,那么在C中声明它自己的记录器

private static final Logger logger = Logger.getLogger(C.class.getName());
这样,当C运行一些代码时,它会记录到自己的记录器,当B运行代码时,它会记录到自己的记录器。您将能够清楚地看到哪个类以这种方式记录了什么

如果这不是你想要的,请用你想要达到的目标和原因来扩展这个问题

我不确定以下代码是否是一个好主意(我总是希望实际运行代码的类成为记录器),但它应该可以工作:

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;);  
}

您可以在基类中使用此选项:

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

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

您得到的输出是什么?你试过了吗?为什么你需要子类来使用它自己的记录器?的每个子类都将由任务引擎执行。一些类(如我的示例中的C)扩展了另一个任务。如果C不重写B.run(),我就没有办法强迫它使用自己的记录器。除非我添加一个getLogger()方法。但是如果C不重写B.run(),那么C在做什么?大概它有被调用的方法,您可以将这些方法记录到它自己的记录器中。如果您真的想(并且确信这是一个好主意)总是登录到B,C记录器实例,这取决于哪个是具体的实现,您可以使用Logger getLogger()方法,该方法以多态方式返回层次结构中最低的记录器。我猜使其非静态的问题在于对象的每个实例都将进行此调用。我知道它将返回现有的记录器,但它仍然是java.util.logger类中执行的额外代码,用于查找每个新实例。无论如何,如果每个新的子类都需要以指定的样式定义一个新的记录器-设计有问题,imho。我想这取决于您的设计目标是什么-如果您对类层次结构记录到同一个记录器感到满意,那么只需在树的顶部声明它,并允许所有子类记录到它。如果您想为每个类记录日志,那么为每个子类提供自己的日志。我一直认为每个子类都有自己的日志记录方法。我会删除“如果您将使用非抽象基类”,因为您可以在抽象基类中使用它。另外,使用
this
是不必要的,因为您可以只使用
getClass()
@Jason S-我不使用“this”来指定子类。它只用于更可读的代码。感谢您对“非抽象”的建议。您对我的示例的修改正是我看到的可能解决方案。是的,如果这是您所追求的-这是我看到它发生的唯一方式(现在恢复-我错过了花括号…DOH!),如果您同意记录器不是静态的,@StKiller的另一个答案实现了与这个答案相同的好处,但代码要简洁得多。
protected Logger logger = Logger.getLogger(this.getClass().getName());