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

告别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级消息

创新互联建站致力于互联网网站建设与网站营销,提供成都网站制作、成都网站设计、网站开发、seo优化、网站排名、互联网营销、微信平台小程序开发、公众号商城、等建站开发,创新互联建站网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。

可以看出,优先级低于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");

   

  }

}


网站名称:告别System.out.print()—J2SDK1.4新增Java日志框架(三)(转)
本文地址:http://pwwzsj.com/article/ipjdsd.html