From Gossip@Openhome

Java Gossip: Logging 的層級

在進行訊息的記錄時,依情節的不同,我們會設定不同等級的訊息輸出,您可以透過操作 Logger 的幾個方法來得到不同等級的訊息輸出,例如:
  • LoggingDemo.java
package onlyfun.caterpillar;

import java.util.logging.*;

public class LoggingDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger("loggingTest");

logger.severe("嚴重訊息");
logger.warning("警示訊息");
logger.info("一般訊息");
logger.config("設定方面的訊息");
logger.fine("細微的訊息");
logger.finer("更細微的訊息");
logger.finest("最細微的訊息");
}
}

執行結果:
2005/2/3 下午 07:10:43 onlyfun.caterpillar.LoggingDemo main
嚴重的: 嚴重訊息
2005/2/3 下午 07:10:43 onlyfun.caterpillar.LoggingDemo main
警告: 警示訊息
2005/2/3 下午 07:10:43 onlyfun.caterpillar.LoggingDemo main
資訊: 一般訊息


依照不同的等級,您可以採用不同的訊息等級方法,程式中依程度高低撰寫,注意到 config 以下的訊息並沒有顯示出來,這是因為 Logger 的預設等級是 INFO,比這個等級更低的訊息,Logger 並不會理會它。

Logger 的預設等級是定義在執行環境的屬性檔logging.properties中,這個檔案位於執行環境安裝目錄的lib目錄下,部份內容如下:
handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
 

Logger 預設的 Handler 是 ConsolerHandler, 也就是將訊息輸出至主控台,一個 Logger 可以維護多個 Handler,每個 Handler 可以有自己的訊息等級,在通過 Logger 的等級限制後,實際上還要再經過 Handler 的等級限制,所以上面的例子中您如果想要看到所有的訊息,則必須同時設定 Logger 與 ConsolerHandler 的等級,例如:
  • LoggingDemo.java
package onlyfun.caterpillar;

import java.util.logging.*;

public class LoggingDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger("loggingTest");
logger.setLevel(Level.ALL);

ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);

logger.severe("嚴重訊息");
logger.warning("警示訊息");
logger.info("一般訊息");
logger.config("設定方面的訊息");
logger.fine("細微的訊息");
logger.finer("更細微的訊息");
logger.finest("最細微的訊息");
}
}

執行結果:
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
嚴重的: 嚴重訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
嚴重的: 嚴重訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
警告: 警示訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
警告: 警示訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
資訊: 一般訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
資訊: 一般訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
配置: 設定方面的訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
細緻: 細微的訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
更細緻: 更細微的訊息
2005/2/3 下午 07:22:59 onlyfun.caterpillar.LoggingDemo main
最細緻: 最細微的訊息


Level.ALL 表示顯示所有的訊息,如果您想要關閉所有的訊息,可以設定為Level.OFF

Logger 的server()、warning()、info()等等的方法,實際上是個便捷的方法,您也可以直接使用log()方法並指定等級來執行相同的作用,例如下面這個程式的執行結果是一樣的:

  • LoggingDemo.java
package onlyfun.caterpillar;

import java.util.logging.*;

public class LoggingDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger("loggingTest");
logger.setLevel(Level.ALL);

ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);

logger.log(Level.SEVERE, "嚴重訊息");
logger.log(Level.WARNING, "警示訊息");
logger.log(Level.CONFIG, "一般訊息");
logger.log(Level.CONFIG, "設定方面的訊息");
logger.log(Level.FINE, "細微的訊息");
logger.log(Level.FINER, "更細微的訊息");
logger.log(Level.FINEST, "最細微的訊息");
}
}