| 笔名:强强联手 | |
| 地区: 江苏-南京 | |
| 作者相册 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
/** *个人收藏,独自向前 *仅供参考,无需争论 *好东西大家分享 **/
告别System.out.print()?J2SDK1.4新增Java日志框架(三)
| 告别System.out.print()?J2SDK1.4新增Java日志框架(三) |
|
2003-1-15 7:02:04 LoggingLevelTest main 信息: 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"); } } 后记 |