心無(wú)痕的博客

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          JAVA技術(shù)文檔

          JAVA精典網(wǎng)站

          開(kāi)發(fā)工具

          數(shù)據(jù)庫(kù)

          最新評(píng)論

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

          由于項(xiàng)目中用到了Applet與Servlet之間(客戶端用Applet、Server端用Servlet)的通信,要求:
                 1:>客戶端與服務(wù)端必須出Log.
                 2:>瀏覽器在加載Applet時(shí)已有好多個(gè)JAR文件需要加載,故不想再附加Log4J對(duì)應(yīng)的JAR包。
          基于上面的要求,便想到了使用JDK自帶的LOG輸出功能,具體Logger對(duì)象的工廠類如下:
                  

          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 代表自動(dòng)編號(hào)
           private static final String logFile = "%h/topo%g.log";
           // 寫入到任何一個(gè)文件的最大字節(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級(jí)別
           private static final Level defaultLevel = Level.INFO;
           
           // Logger存儲(chǔ)器
           private static final HashMap<String, Logger> hmLogger = new HashMap<String, Logger>();
           
           // 為對(duì)Logger存儲(chǔ)器訪問(wèn)提供的同步鎖對(duì)象
           private static final Object syncLock = new Object();
           
          /**
          *   此處是測(cè)試方法。
          **/
          public static void main(String[] args) {
              Logger logger = getLogger(null); // 此處用Null代表用本類(TopoLogger)的類名作為L(zhǎng)ogger的名稱
              try {
                  System.out.println(Long.parseLong(null));
              } catch(Exception ex) {
                  TopoLogger.getLogger(null).log(Level.SEVERE, "很嚴(yán)重喲", ex);
            }
          }
           
           /**
            * 從Logger存儲(chǔ)器取得Logger對(duì)象。
            * @param strClassName
            * @return
            */
           public static Logger getLogger(String strClassName) {
            Logger logger = null;
            synchronized (syncLock) {
             if (strClassName == null) {  // 取當(dāng)前Logger類默認(rèn)的Logger對(duì)象
              String strDefaultClassName = TopoLogger.class.getName();
              logger = hmLogger.get(strDefaultClassName);
              if (logger == null) {
               logger = Logger.getLogger(strDefaultClassName);
               hmLogger.put(strDefaultClassName, logger);
              }
             } else { // 新生成一個(gè)指定名稱的Logger對(duì)象
              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)換時(shí)間。
             * @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);
            }
            
            /**
             * 取例外對(duì)象的信息。
             * @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)容是通過(guò)程序中定義的文件來(lái)存儲(chǔ)的,在$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ù)文檔”鏈接分類也有對(duì)JDK的Logger的描述,可以參見(jiàn)該文檔互相學(xué)習(xí)。。。。。謝謝!!!

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

          評(píng)論

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

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

          主站蜘蛛池模板: 察隅县| 安新县| 灵璧县| 麟游县| 长兴县| 潞西市| 阜城县| 太康县| 临潭县| 明星| 梁平县| 镇安县| 巫溪县| 湛江市| 醴陵市| 青州市| 柳河县| 搜索| 仁寿县| 临湘市| 灵璧县| 柯坪县| 邛崃市| 新泰市| 扎鲁特旗| 专栏| 蒙阴县| 汽车| 遂昌县| 朝阳市| 丰顺县| 曲阳县| 英山县| 贵州省| 阳原县| 大同市| 临沂市| 铅山县| 南雄市| 韶关市| 西平县|