日志级别java.util.log.Level
java中将日志是一个比较简单的对象,只有三个属性,name,value,resourceBundleName,分别表示日志的名称,值和资源文件名称,日志分为了以下6个级别,这六个级别在Level中以静态常量的方式出现(注意该类的构造方法是protected,意味着只有子类中才能使用new来构造该对象,resourceBundleName默认读取sun.util.logging.resources.logging)
Level.OFF = new Level("OFF",Integer.MAX_VALUE,defaultBundle) --这个日志级别比较特殊,用来关闭日志
Level.SEVERE = new Level("SEVERE",1000,defaultBundle) --系统比较严重的错误级别,一般是无法恢复的bug
Level.WARNING = new Level("WARNING",900,defaultBundle) --警告提示
Level.INFO = new Level("INFO",800,defaultBundle) --普通信息输出
Level.CONFIG = new Level("CONFIG",700,defaultBundle) --静态配置信息输出,如cpu,mem
Level.FINE = new Level("FINE",600,defaultBundle) --
Level.FINER = new Level("FINER",500,defaultBundle) --
Level.FINEST = new Level("FINEST",400,defaultBundle) --FINE,FINER,FINEST三个日志级别都是用来跟踪日志信息,输出信息的详细程度依次递增
Level.ALL = new Level("ALL",Integer.MIN_VALUE,defaultBundle) --所有的日志信息都输出
学习到了什么?
1)对象常量化
系统中的日志级别不多,将所有的对象都搞成静态变量,只要初始化一次,任何时候都能调用了
2)防止外部程序泛滥调用new来生成日志级别对象
可以看到Level类的构造函数声明为protected类型的,就是为了让外部调用程序直接引用静态常量而不是用new 来生成自己的对象,同时又保留来该类的可扩展性质,子类依旧可以扩展父类的构造方法来生成对象
3)日志级别的递增/递减性
可以看到一个日志对象的名称只是对该级别的一个文本描述,而级别的值遵循了从小到大依次递增的规律,从Integer.MAX_VALUE到Integer.MIN_VALUE,输出日志信息越来越详细,这种设计的好处可以在程序里通过很简单的整数大小判断来决定输出哪个级别的日志,if(level<=Level.ALL){}else if(level <=Level.FINEST){}...
4)小技巧--Level类中有个静态方法,把一个字符串转换成一个Level对象,如传入"INFO"返回Level.INFO,也可以传入"400",返回Level.FINEST
public static synchronized Level parse(String name) throws IllegalArgumentException {
name.length(); //--一个检查空指针的另类方法
//先通过名称检查如传入的是"INFO"的情况,如果找到了直接返回了
// Look for a known Level with the given non-localized name.
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (name.equals(l.name)) {
return l;
}
}
//如果不是类似“INFO”这种格式的,检查是否是如“400”这样的
try {
int x = Integer.parseInt(name);
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (l.value == x) {
return l;
}
}
// Create a new Level.
return new Level(name, x);
} catch (NumberFormatException ex) {
// Not an integer.
// Drop through.
}
//即不是如“INFO”,又不是"400"格式,检查资源文件
for (int i = 0; i < known.size(); i++) {
Level l = (Level) known.get(i);
if (name.equals(l.getLocalizedName())) {
return l;
}
}
// 都不是报错了
throw new IllegalArgumentException("Bad level /"" + name + "/"");
}