心無痕的博客

          常用鏈接

          統計

          積分與排名

          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 心無痕 閱讀(3232) 評論(1)  編輯  收藏 所屬分類: JAVA

          評論

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

          開發技術,系統分析,架構,項目管理,公司運營,外包,合作
          群將滿,不發言的踢出
          群號:47763528
            回復  更多評論   

          主站蜘蛛池模板: 常州市| 榕江县| 武隆县| 镇坪县| 高淳县| 青铜峡市| 洪洞县| 吉安市| 烟台市| 宁波市| 安图县| 尼玛县| 平昌县| 宁都县| 永年县| 桃江县| 宿迁市| 合水县| 临沭县| 城固县| 东海县| 邻水| 准格尔旗| 梁山县| 蒲江县| 永和县| 常宁市| 渭源县| 宁夏| 梁山县| 江城| 裕民县| 连南| 喀喇| 白银市| 洪泽县| 大名县| 道孚县| 万安县| 五家渠市| 安岳县|