ITEEDU

Java Gossip: Logger 阶层关系

在取得Logger的时候,给getLogger()方法的名称是有 意义的,如果您给定"onlyfun",实际上您将从root logger继承一些特性,像是记录等级(Level)以及root logger的Handler,如果您再取得一个Logger,而给定名称"onlyfun.caterpillar",则这次取得的Logger将继承 命名为"onlyfun"这个Logger的特性。

下面这个程序可以看出,三个Logger(包括root logger)在名称上的继承关系:

LoggerHierarchyDemo.java
package onlyfun.caterpillar;
import java.util.logging.*;
public class LoggerHierarchyDemo {
	public static void main(String[] args) {
		Logger loggerOnlyfun = Logger.getLogger("onlyfun");
		Logger loggerCaterpillar =
		Logger.getLogger("onlyfun.caterpillar");
		System.out.println(loggerOnlyfun.getParent());
		System.out.println(
		loggerCaterpillar.getParent().getName());
		System.out.println(loggerCaterpillar.getName());
		loggerOnlyfun.setLevel(Level.WARNING);
		loggerCaterpillar.info("caterpillar' info");
		loggerCaterpillar.setLevel(Level.INFO);
		loggerCaterpillar.info("caterpillar' info");
	}
}

getParent()方法可以取得Logger的上层父Logger,root logger并没有名称,所以直接呼叫它的toString()以取得字符串,当Logger没有设定等级时,则使用父Logger的等级设定,所以在 上例中,loggerOnlyfun设定等级为WARNING时,loggerCaterpillar呼叫info()时并不会有讯息显示,只有在 loggerCaterpillar设定了自己的等级为INFO之后,才会显示讯息,执行结果如下:

java.util.logging.LogManager$RootLogger@757aef
onlyfun
onlyfun.caterpillar
2005/2/4 上午 09:07:32 onlyfun.caterpillar.LoggerHierarchyDemo main
信息: caterpillar' info

在每一个Handler方面,当每一个Logger处理完自己的记录动作之后,它会向父节点传播,让父节点的Handler也可以处理记录,例如root logger的Handler是ConsoleHandler,所以您的子节点Logger加入了FileHandler来处理完记录之后,向上传播至父 节点时,会再由ConsolerHandler来处理,所以一样会在主控台上显示讯息。