2010-04-20 136 views
2

我生成這樣兩個實例:爲什麼新實例使用舊實例的記錄器?

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

的遊戲管理的start()方法看起來像這樣:

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

當我創建遊戲實例我創建了一個loger:log = Logger.getLogger("TestLog");log是公共領域game所屬類)。

game.start()我運行許多過程和給它們相應的log的參考。所以,我期望manager1和manager2會寫入不同的文件。但是manager2寫入它自己的文件和manager1的日誌文件。爲什麼會發生?

回答

0

假設您使用Log4J或java.util.logging(基於Log4J),每個類/名稱只會記錄一個。無論您使用相同的參數調用getLogger方法多少次,它都會返回完全相同的對象。

因此,當您在每個實例中調用getLogger("TestLog")時,您將獲得對同一個Logger對象的引用。因此它只會記錄到一個地方,即爲「TestLog」記錄器配置的地方。

如果你想擁有這兩個實例輸出去不同的地方,你就需要讓他們打電話getLogger使用不同的參數,使他們獲得不同的記錄器(當然配置日誌記錄系統,使得這兩個記錄器有不同的輸出)。

2

這兩次都使用相同的日誌名稱「TestLog」,所以兩次都得到相同的Logger實例。這就是這個班級的工作原理。如果您使用內置的java.util.logging.Logger類,請參閱here。其他日誌包可能有類似的行爲。

0

從大多數日誌框架的角度來看,放在getLogger方法中的名稱是記錄器唯一的名稱,而不是類實例。所以當你打電話給Logger.getLogger("TestLog");時,你會得到相同的記錄器。

相關問題