2017-06-29 141 views
0

我的目標是使用java.util.logging Level類並將Level級別字符串(如'FINE')更改爲'VERBOSE'。覆蓋java.util.logging的最佳方法更改級別字符串的Level級別

public static final Level FINE = new Level("FINE", 500);

我知道我們可以通過擴展級別如下做到這一點:

public class MyLogLevel extends Level { 
    private static final long serialVersionUID = -8176160795706313070L; 
    private static final Level FINE = new MyLogLevel("VERBOSE", 500); 

    protected MyLogLevel(String name, int level) { 
     super(name, level); 
    } 


} 

我想知道,這是很好的辦法做到這一點還是有什麼更好的辦法來做到這一點。

+0

看起來不錯。你有錯誤的問題嗎? – Strelok

+1

問題不在於直接使用'Level.FINE'的任何庫代碼都不會被替換嗎?爲什麼你想首先替換這些字符串? – Thomas

回答

0

如果您正在運行Oracle JDK或OpenJDK,則可以簡單地覆蓋現有級別的本地化名稱。您可以通過在包sun.util.logging.resources下創建新的資源包(屬性文件或資源包類)來完成此操作。 bundle name必須採用logging_LANG_COUNTRY的形式。

例如,這裏是在項目的測試程序調用LevelTest

import java.util.Locale; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 

public class NewLevels { 

    public static void main(String[] args) { 
     System.out.println(Locale.getDefault()); 
     ResourceBundle rb = ResourceBundle.getBundle("sun.util.logging.resources.logging"); 
     System.out.println(rb.getLocale()); 
     System.out.println(Level.FINE.getLocalizedName()); 
     System.out.println(Level.FINER.getLocalizedName()); 
     System.out.println(Level.FINEST.getLocalizedName()); 
    } 
} 

當我執行這個測試打印的區域設置爲en_US。因此我的資源包名稱將爲logging_en_US.properties

屬性資源包將包含以下內容:

FINE=VERBOSE 
FINER=VERBOSE 
FINEST=VERBOSE 

下面是項目結構上的列表:

%USERPROFILE%\Documents\Projects\LevelTest\src\NewLevels.java 
%USERPROFILE%\Documents\Projects\LevelTest\src\sun\util\logging\resources\logging_en_US.properties 

當我運行程序我得到以下輸出:

en_US 
en_US 
VERBOSE 
VERBOSE 
VERBOSE 

在一個更大的項目上,你可能不得不打一些類裝載機issu以確保正確的資源包位於。

另外,如果你不想這樣做,你可以求助於創建一個custom formatter