2012-08-14 48 views
2

我有一個java命令行工具,可以在最開始時關閉註銷,然後解析命令行,之後可能再次打開日誌記錄,具體取決於命令行處理的結果。更改記錄器可能會丟失

主要方法是這樣開始的:

public static void main(final String[] args){ 
    java.util.logging.LogManager.getLogManager().reset(); 
    java.util.logging.Logger globalLogger = java.util.logging.Logger 
      .getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME); 
    globalLogger.setLevel(java.util.logging.Level.OFF); 
    [... parse command line and possibly turn logging back on] 

現在FindBugs的給予 「令人不安」 警告說:

更改記錄器可在com.bmw.fnw丟失。 DBMainDialog.main(String [])

Find Bugs Description 我下認爲記錄器可以在不應該時記錄下來。

如何正確關閉記錄儀?

回答

1

您是否使用了查找錯誤描述所述的OpenJDK?

既然他們談論弱引用,我想到的是你可以在這個記錄器的某處創建一個靜態引用,以避免在垃圾回收期間丟失它。

要測試這個問題,你可以在你的代碼中調用你自己的垃圾收集器,看它是否改變了任何東西。

+2

無論您使用的是哪個JDK。運行該代碼的人可能會使用OpenJDK。因此,無論您使用的是哪個JDK,都應該修復這個「bug」。 – Polygnome 2012-08-14 09:57:31

+1

感謝您的回答。我做了我的記錄器'私有最終靜態',但現在FindBugs抱怨'globalLogger.setLevel(java.util.logging.Level.OFF);'具有相同的錯誤消息。現在我該怎麼做? – bbuser 2012-08-14 14:23:28

3

只要您需要它(可能是您的程序的整個生命週期),只要持有記錄器的強烈參考即可。

您給出的鏈接已經解釋了原因: 在OpenJDK中,logManager內部只保留弱引用。因此,只要沒有強大的參考,記錄器就有資格進行垃圾收集。所以你要設定配置,但不要強調參考。它可能是垃圾收集。當你再次獲取記錄器時,會新建一個新記錄器。通過持有強有力的參考來防止垃圾收集。

+1

我已經讓我的記錄器變成靜態的,但現在FindBugs抱怨'globalLogger.setLevel(java.util.logging.Level.OFF);'。 – bbuser 2012-08-14 14:43:52

0

我有完全相同的問題,也無法擺脫警告。我不知道FindBugs是否只是搞亂了我們,但持有強烈的參考似乎沒有幫助。

爲了擺脫這個警告,我只包含了log4j。然後,您可以將-Dlog4j.configuration = < FILE_PATH>設置爲jvm參數的一部分。 FILE_PATH是log4j.properties文件的路徑。 參考:log4j configuration via JVM argument(s)?

這將停止給你的警告,你仍然可以配置調試級別。希望這可以幫助!

A〜