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