ITEEDU

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, "最细微的讯息");
	}
}