告别System.out.print()—J2SDK1.4新增Java日志框架(三) (转)[@more@]

2003-1-15 7:02:04 LoggingLevelTest mainXML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

信息: INFO级消息

可以看出,优先级低于INFO的日志消息不被记录。

Level的构造函数为protected便于程序员开发自己的消息级别类。

import Java.util.logging.*;

//自定义消息级别

class myLevel extends Level{

//定义自己的消息级别SYSE

public static final Level SYSE = new myLevel("SYSE", Level.SEVERE.intValue()+10);

public myLevel(String ln,int v) {

super(ln,v);

}

}

public class MyLevelTest {

public static void main(String args[]) {

Logger logger1 = Logger.getAnonymousLogger();

//设置消息级别

logger1.setLevel(myLevel.SYSE);

//记录消息

logger1.log(myLevel.SYSE,"SYSE消息");

logger1.severe("SVERE消息");

}

}

实例4

运行结果:

2003-1-15 15:40:04 MyLevelTest main

SYSE: SYSE消息

只有SYSE消息被记录,SVERE消息不被记录,因为自定义级别SYSE高于SEVERE.

(五)Formatter

Formatter负责对LogRecords进行格式化。每个记录处理器Handler同一个Formatter对象相关联。Formatter对象接收从Handler传来的LogRecord,将其格式化成字符串后返回给Handler进行输出。

Formatter是一个抽象类。在J2SDK1.4中,其子类及它们之间的关系见图二。

自定义扩展Formatter类。实例:MyFormatterTest.java

import java.util.Date;

import java.util.logging.*;

//创建每条日志记录以行的日志格式:

//时间<空格>消息级别<空格>消息ID<空格>日志信息内容<换行>

class MyFormatter extends Formatter {

public String format(LogRecord rec) {

StringBuffer buf = new StringBuffer(1000);

buf.append(new Date().toLocaleString()); //时间

buf.append(' ');

buf.append(rec.getLevel()); //消息级别

buf.append(' ');

buf.append(rec.getMillis()); //作为消息ID

buf.append(' ');

buf.append(formatMessage(rec));//格式化日志记录数据

buf.append('n'); //换行

return buf.toString();

}

}

public class MyFormatterTest {

public static void main(String args[]){

//创建记录器

Logger log1 = Logger.getLogger("MyLogger");

//创建记录处理器

Handler mh = new ConsoleHandler();

//为记录处理器设置Formatter

mh.setFormatter(new MyFormatter());

//为记录器添加记录处理器

log1.addHandler(mh);

//禁止消息处理将日志消息上传给父级处理器

log1.setUseParentHandlers(false);

//记录消息

log1.severe("消息1");

log1.warning("消息2");

log1.info("消息3");

log1.config("消息4");

}

}

实例5

程序运行结果:

2003-1-15 16:59:38 SEVERE 1042621178968 消息1

2003-1-15 16:59:40 WARNING 1042621178985 消息2

2003-1-15 16:59:41 INFO 1042621179105 消息3

三、配置文件

J2SDK1.4的Java Logging框架的配置文件(windows):

%J2SDK1.4_HOME%/jre/lig/logging.properties

从配置文件可以看到:

(一) 自定义日志配置文件:

java -Djava.util.logging.config.file=myfile

(二)全局Handler在Java VM启动时被加载。

(二) 全局Handler默认为java.util.logging.ConsoleHandler。

handlers= java.util.logging.ConsoleHandler

所以我们的任何日志记录动作都会在控制台进行显示。

(三) 缺省的消息记录级别为:INFO

.level= INFO

在缺省情况下我们在控制台看不见低于INFO级别的日志消息。

(四) 缺省的Handler消息格式为java.util.logging.SimpleFormatter

四、日志框架在程序测试中的应用

Logger类提供了两个的方法:Logger.entering() ogger.exiting() 。这对我们调试自己的方法调用提供了便利的方式。

例子:

记录方法调用的输入参数和输出参数 方法myMethod将一个int 追加在一个对象之后。

运行该程序应将logging.properties的

java.util.logging.ConsoleHandler.level = INFO

改为:

java.util.logging.ConsoleHandler.level = ALL

import java.util.logging.*;

public class MyClass {

public String myMethod(int p1, object p2) {

Logger logger = Logger.getLogger("com.mycompany.MyClass");

if (logger.isLoggable(Level.FINER)) {

logger.entering(this.getClass().getName(), "myMethod",

new Object[]{new Integer(p1), p2});

}

String tmp = p2.toString() + p1;

if (logger.isLoggable(Level.FINER)) {

logger.exiting(this.getClass().getName(), "myMethod", tmp);

}

return tmp;

}

public static void main(String args[]) {

MyClass mc = new MyClass();

String rslt = mc.myMethod(123,"Hello");

}

}

后记

J2SDK1.4引入的日志记录框架为构建简易的日志记录系统提供了便利的解决方案。虽然还有期它的一些专用日志包如Log4j,但从简单的打印输出到严密的、可扩展的日志记录框架,J2SDK1.4的日志系统已经足以满足一般的系统开发的要求。