2016-08-20 100 views
0

我有一個桌面Java應用程序,我預見到Java日誌記錄就足夠了。爲了讓事情簡單我使用java全球記錄器來獲得,而不是通過任何特定的記錄器名稱記錄Java日誌記錄全局日誌程序

 Logger logger = Logger.getGlobal(); 
     String logFilePath = Config.INSTANCE.getProperty("logFilePath"); 
     FileHandler fileHandler = new FileHandler(logFilePath); 
     logger.addHandler(fileHandler); 
     SimpleFormatter formatter = new SimpleFormatter(); 
     fileHandler.setFormatter(formatter); 

正如你可以在上面看到,我也是在輸出文件路徑的條款進行更改全局記錄和格式化程序。

我的問題是關於全局記錄器的範圍,它是全球範圍內的JVM?或全局範圍的應用程序?如果全局範圍在JVM之上,我是否應該期望共享相同JVM的應用程序產生副作用? 小費: 我已經通過這個線程In java.util.logging, what is the global logger for?,但評論是我可以利用的東西。

回答

6

是的,每個JVM只有一個全局記錄器實例。因此,JVM中的所有應用程序將共享相同的全局記錄器實例。

如果您想看看它是如何聲明的,請參考java.util.Loggersource。它已被宣佈爲在線218

@Deprecated 
218 public static final Logger global = new Logger(GLOBAL_LOGGER_NAME); 

這就是說,你真的不應該使用全局記錄器,因爲它很容易發生死鎖。引用與全局記錄器字段相關的Java文檔:

不推薦:此字段的初始化容易出現死鎖。 字段必須由Logger類初始化進行初始化,這可能會導致LogManager類初始化發生死鎖。在這種情況下,兩類初始化相互等待完成。從 JDK版本1.6開始,通過調用Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)獲取全局記錄器對象的首選方法是 。

如果你確實非常認真對待日誌(你應該是這樣),那麼就考慮使用日誌記錄器設置來聲明每個組件的記錄器。

相關日誌的鏈接:

Java Logging API Tutorial

Configuring Java Loggers

Good logging practices

0

如果幾個應用程序共享相同的JVM(這是桌面應用程序的常見場景,我不認爲你真的需要擔心這一點),它們將共享相同的引導和系統類加載器,其中包括java.*包(應用程序類可以分開)。

因此,每個JVM只有一個全局記錄器實例。