在取得Logger的时候,给getLogger()方法的名称是有 意义的,如果您给定"onlyfun",实际上您将从root logger继承一些特性,像是记录等级(Level)以及root logger的Handler,如果您再取得一个Logger,而给定名称"onlyfun.caterpillar",则这次取得的Logger将继承 命名为"onlyfun"这个Logger的特性。
下面这个程序可以看出,三个Logger(包括root logger)在名称上的继承关系:
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来处理,所以一样会在主控台上显示讯息。