<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心無痕的博客

    常用鏈接

    統(tǒng)計

    積分與排名

    JAVA技術(shù)文檔

    JAVA精典網(wǎng)站

    開發(fā)工具

    數(shù)據(jù)庫

    最新評論

    用JDK中提供的java.util.logging.*包創(chuàng)建Logger對象----原創(chuàng)

    由于項(xiàng)目中用到了Applet與Servlet之間(客戶端用Applet、Server端用Servlet)的通信,要求:
           1:>客戶端與服務(wù)端必須出Log.
           2:>瀏覽器在加載Applet時已有好多個JAR文件需要加載,故不想再附加Log4J對應(yīng)的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;

    /**
     * 拓?fù)銵ogger。
     * @author xinwuhen
     *
     */
    public class TopoLogger {
     // Log文件的路徑及格式:%h 代表用戶主目錄 %g 代表自動編號
     private static final String logFile = "%h/topo%g.log";
     // 寫入到任何一個文件的最大字節(jié)數(shù)
     private static final int limit = 5 * 1024;
     // 要使用的文件數(shù)
     private static final int count = 20;
     // 指定 append 模式
     private static final boolean append = true;
     // 默認(rèn)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, "很嚴(yán)重喲", ex);
      }
    }
     
     /**
      * 從Logger存儲器取得Logger對象。
      * @param strClassName
      * @return
      */
     public static Logger getLogger(String strClassName) {
      Logger logger = null;
      synchronized (syncLock) {
       if (strClassName == null) {  // 取當(dāng)前Logger類默認(rèn)的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);
        }
       }
      }
      
      // 添加默認(rèn)的文件處理句柄
      logger.addHandler(getFileHandler());
      
      return logger;
     }
     
     /**
      * 取默認(rèn)的文件處理句柄。
      * @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();
      }
      
      /**
       * 根據(jù)指定格式轉(zhuǎn)換時間。
       * @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;
      }
     }
    }

    ++++ 輸出結(jié)果如下(注意內(nèi)容是通過程序中定義的文件來存儲的,在$USER_HOME/topo0.log中):++++
    [2008-03-07 21:01:328, 000], SEVERE, com.quantanetwork.esm.logic.topo.TopoLogger,main 很嚴(yán)重喲:
    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)
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    以上內(nèi)容拋磚引玉,望大家有其它輸出方式的更好實(shí)現(xiàn)。。。。。。另外,本人博客中的“JAVA技術(shù)文檔”鏈接分類也有對JDK的Logger的描述,可以參見該文檔互相學(xué)習(xí)。。。。。謝謝?。?!

    posted on 2008-03-07 21:00 心無痕 閱讀(3231) 評論(1)  編輯  收藏 所屬分類: JAVA

    評論

    # re: 用JDK中提供的java.util.logging.*包創(chuàng)建Logger對象----原創(chuàng) 2008-03-11 13:19 Jack.Wang

    開發(fā)技術(shù),系統(tǒng)分析,架構(gòu),項(xiàng)目管理,公司運(yùn)營,外包,合作
    群將滿,不發(fā)言的踢出
    群號:47763528
      回復(fù)  更多評論   

    主站蜘蛛池模板: 亚洲av日韩av激情亚洲| 亚洲精品9999久久久久无码| 亚洲一级毛片免费观看| 香蕉大伊亚洲人在线观看| 免费人成无码大片在线观看| 国产伦精品一区二区免费| 久久精品国产亚洲AV久| 国产啪亚洲国产精品无码 | 涩涩色中文综合亚洲| 免费人成视频在线观看视频| 免费高清国产视频| 亚洲精品女同中文字幕| 亚洲国产成人久久综合碰碰动漫3d | 黄色一级毛片免费| 久久精品亚洲中文字幕无码麻豆| 白白国产永久免费视频| 国产成人免费ā片在线观看老同学| 亚洲第一成人在线| 国产亚洲人成无码网在线观看| 在线观看无码的免费网站| 最近中文字幕大全免费版在线| 亚洲国产成人久久综合| 亚洲国产综合专区电影在线| 亚洲成A人片77777国产| 男女免费观看在线爽爽爽视频| 一级成人a免费视频| 亚洲伊人久久大香线蕉AV| 亚洲AV成人片色在线观看| 国产成人免费永久播放视频平台| 久久国产乱子免费精品| 一级视频在线免费观看| 亚洲av产在线精品亚洲第一站| 亚洲精品乱码久久久久久久久久久久| 天天摸天天操免费播放小视频| 波多野结衣免费一区视频| 边摸边吃奶边做爽免费视频99| 亚洲a级片在线观看| 久久丫精品国产亚洲av不卡| 国产AV无码专区亚洲AWWW| 国产真实伦在线视频免费观看| 在人线av无码免费高潮喷水|