覆盖java.util.logging Level类以更改级别字符串的最佳方法

时间:2017-06-29 14:12:01

标签: java java.util.logging

我的目标是使用java.util.logging Level类并将Level字符串更改为'VERBOSE'。

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

我知道我们可以通过扩展Level来实现这一目的:

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);
    }


}

我想知道,这是做这件事的好方法,还是有更好的方法去做。

1 个答案:

答案 0 :(得分: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

在较大的项目中,您可能必须解决一些类加载器问题,以确保找到正确的资源包。

或者,如果您不想这样做,可以求助于创建custom formatter