为什么新实例使用旧实例的记录器?

时间:2010-04-20 14:47:56

标签: java oop field logging

我以这种方式生成了2个实例:

    gameManager manager1 = new CTManager(owner,players1,"en");
    manager1.start();
    gameManager manager2 = new CTManager(owner,players2,"en");
    manager2.start();

gameManager的start()方法如下:

void start() {
    game.start();
}

当我创建游戏实例时,我创建了一个loger:log = Logger.getLogger("TestLog");loggame所属的类的公共字段。

game.start()我运行了很多进程,并为他们提供了对应log的引用。所以,我希望manager1和manager2会写入不同的文件。但是manager2写入自己的文件和manager1的日志文件。为什么会这样?

3 个答案:

答案 0 :(得分:2)

两次使用相同的日志名称“TestLog”,因此两次都获得Logger的相同实例。这就是那个班级的工作方式。如果您使用的是内置java.util.logging.Logger课程,请参阅here。其他日志包可能具有类似的行为。

答案 1 :(得分:0)

假设您正在使用Log4J或java.util.logging(基于Log4J),每个类/名称只会记录一个。无论您使用相同的参数调用getLogger方法多少次,它都会返回完全相同的对象。

因此,当您在每个实例中调用getLogger("TestLog")时,您将获得对完全相同的Logger对象的引用。因此,它只会记录到一个位置,即为“TestLog”记录器配置的位置。

如果您希望将这两个实例的输出转到不同的位置,则需要让它们使用不同的参数调用getLogger,以便它们获得不同的记录器(当然,还要配置日志记录系统,以便这两个记录器有不同的输出。)

答案 2 :(得分:0)

从大多数日志记录框架的角度来看,您在getLogger方法中放置的名称是使记录器唯一的原因,而不是类实例。因此,当您致电Logger.getLogger("TestLog");时,您会在每种情况下获得相同的记录器。