心无痕的博客

常用链接

统计

积分与排名

JAVA技术文档

JAVA精典网站

开发工具

数据库

最新评论

用JDK中提供的java.util.logging.*包创建Logger对象----原创

由于项目中用到了Applet与Servlet之间(客户端用Applet、Server端用Servlet)的通信,要求:
       1:>客户端与服务端必须出Log.
       2:>浏览器在加载Applet时已有好多个JAR文件需要加载,故不想再附加Log4J对应的JAR包。
基于上面的要求,便想到了使用JDK自带的LOG输出功能,具体Logger对象的工厂类如下:
        

package com.quantanetwork.esm.logic.topo;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

/**
 * 拓扑Logger。
 * @author xinwuhen
 *
 */
public class TopoLogger {
 // Log文件的路径及格式:%h 代表用户主目录 %g 代表自动编号
 private static final String logFile = "%h/topo%g.log";
 // 写入到任何一个文件的最大字节数
 private static final int limit = 5 * 1024;
 // 要使用的文件数
 private static final int count = 20;
 // 指定 append 模式
 private static final boolean append = true;
 // 默认LOG级别
 private static final Level defaultLevel = Level.INFO;
 
 // Logger存储器
 private static final HashMap<String, Logger> hmLogger = new HashMap<String, Logger>();
 
 // 为对Logger存储器访问提供的同步锁对象
 private static final Object syncLock = new Object();
 
/**
*   此处是测试方法。
**/
public static void main(String[] args) {
    Logger logger = getLogger(null); // 此处用Null代表用本类(TopoLogger)的类名作为Logger的名称
    try {
        System.out.println(Long.parseLong(null));
    } catch(Exception ex) {
        TopoLogger.getLogger(null).log(Level.SEVERE, "很严重哟", ex);
  }
}
 
 /**
  * 从Logger存储器取得Logger对象。
  * @param strClassName
  * @return
  */
 public static Logger getLogger(String strClassName) {
  Logger logger = null;
  synchronized (syncLock) {
   if (strClassName == null) {  // 取当前Logger类默认的Logger对象
    String strDefaultClassName = TopoLogger.class.getName();
    logger = hmLogger.get(strDefaultClassName);
    if (logger == null) {
     logger = Logger.getLogger(strDefaultClassName);
     hmLogger.put(strDefaultClassName, logger);
    }
   } else { // 新生成一个指定名称的Logger对象
    logger = hmLogger.get(strClassName);
    if (logger == null) {
     logger = Logger.getLogger(strClassName);
     hmLogger.put(strClassName, logger);
    }
   }
  }
  
  // 添加默认的文件处理句柄
  logger.addHandler(getFileHandler());
  
  return logger;
 }
 
 /**
  * 取默认的文件处理句柄。
  * @return
  */
 private static FileHandler getFileHandler() {
  FileHandler fileHandler = null;
  try {
   fileHandler = new FileHandler(logFile, limit, count, append);
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
   
  }
  if (fileHandler != null) {
   fileHandler.setLevel(defaultLevel);
   fileHandler.setFormatter(new TopoLoggerFormatter());
  }
  return fileHandler;
 }
 
 
 /**
  * Logger格式化处理器。
  *
  * @author xinwuhen
  */
 final static class TopoLoggerFormatter extends Formatter {
  @Override
  public String format(LogRecord record) {
   StringBuffer strOutput = new StringBuffer();
   
   strOutput.append("[");
   strOutput.append(getFormattedTime(record.getMillis(), "yyyy-MM-dd HH:mm:SS, sss"));
   strOutput.append("], ");
   strOutput.append(record.getLevel());
   strOutput.append(", ");
   strOutput.append(record.getSourceClassName());
   strOutput.append(",");
   strOutput.append(record.getSourceMethodName());
   strOutput.append(" ");
   strOutput.append(record.getMessage());
   strOutput.append(":");
   strOutput.append(System.getProperty("line.separator"));
   Throwable throwAble = record.getThrown();
   if (throwAble != null) {
    strOutput.append(getThrowAbleInfo(throwAble));
   }

   return strOutput.toString();
  }
  
  /**
   * 根据指定格式转换时间。
   * @param lngMillTimes
   * @param strTimeFormat
   * @return
   */
  private String getFormattedTime(long lngMillTimes, String strTimeFormat) {
   Date lvDate = new Date();
   lvDate.setTime(lngMillTimes);
   SimpleDateFormat lvFormat = new SimpleDateFormat(strTimeFormat, Locale.CHINA);
   return lvFormat.format(lvDate);
  }
  
  /**
   * 取例外对象的信息。
   * @param throwAble
   * @return
   */
  private String getThrowAbleInfo(Throwable throwAble) {
   String throwAbleInfo = "";
   StackTraceElement[] ste = throwAble.getStackTrace();
   if (ste != null) {
    final String strLineSeparator = System.getProperty("line.separator");
    StringBuffer sbStackTraceEle = new StringBuffer();
    for (StackTraceElement stackTraceElement : ste) {
     sbStackTraceEle.append("        at ");
     sbStackTraceEle.append(stackTraceElement.toString());
     sbStackTraceEle.append(strLineSeparator);
    }
    throwAbleInfo = throwAble.toString() + strLineSeparator + sbStackTraceEle;
   }
   return throwAbleInfo;
  }
 }
}

++++ 输出结果如下(注意内容是通过程序中定义的文件来存储的,在$USER_HOME/topo0.log中):++++
[2008-03-07 21:01:328, 000], SEVERE, com.quantanetwork.esm.logic.topo.TopoLogger,main 很严重哟:
java.lang.NumberFormatException: null
        at java.lang.Long.parseLong(Long.java:372)
        at java.lang.Long.parseLong(Long.java:461)
        at com.quantanetwork.esm.logic.topo.TopoLogger.main(TopoLogger.java:40)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上内容抛砖引玉,望大家有其它输出方式的更好实现。。。。。。另外,本人博客中的“JAVA技术文档”链接分类也有对JDK的Logger的描述,可以参见该文档互相学习。。。。。谢谢!!!

posted on 2008-03-07 21:00 心无痕 阅读(3222) 评论(1)  编辑  收藏 所属分类: JAVA

评论

# re: 用JDK中提供的java.util.logging.*包创建Logger对象----原创 2008-03-11 13:19 Jack.Wang

开发技术,系统分析,架构,项目管理,公司运营,外包,合作
群将满,不发言的踢出
群号:47763528
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: