From Gossip@Openhome

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來處理,所以一樣會在主控台上顯示訊息。