告别System.out.print()—J2SDK1.4新增Java日志框架(三)(转)
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://ybzwz.com/article/ipjdsd.html