dwys0343

          技術(shù)整理

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            1 Posts :: 16 Stories :: 0 Comments :: 0 Trackbacks
          appender 的生命周期
          ?
          1.?????? appender 實(shí)例不存在,或許框架還沒有配置好。
          ?
          2.?????? 框架實(shí)例化了一個(gè)新的 appender。這發(fā)生在配置器類分析配置腳本中的一個(gè) appender 聲明的時(shí)候。配置器類調(diào)用 Class.newInstance(YourCustomAppender.class) ,這等價(jià)于動(dòng)態(tài)調(diào)用 new YourCustomAppender() 。框架這樣做是為了避免被硬編碼為任何特定的 appender 名稱;框架是通用的,適用于任何 appender。
          e.g. log4j.appender.file=org.apache.log4j.RollingFileAppender
          ?
          3.?????? 框架判斷 appender 是否需要 layout。如果該 appender 不需要 layout,配置器就不會(huì)嘗試從配置腳本中加載 layout 信息。
          Appender接口中,有public boolean requiresLayout() 方法,如果return true;則要求layout,需在配置腳本中設(shè)置layout信息
          e.g. log4j.appender.file.layout=org.apache.log4j.PatternLayout
          ?
          4.?????? Log4j 配置器調(diào)用 setter 方法。在所有屬性都已設(shè)置好之后,框架就會(huì)調(diào)用這個(gè)方法。
          此時(shí)對(duì)應(yīng)RollingFileAppender的每個(gè)Field,需要有一個(gè)setter方法,在配置腳本中也要進(jìn)行設(shè)置
          e.g. log4j.appender.file.File=<project>.log
          對(duì)應(yīng)的在RollingFileAppender中,有
          public void setFile(String file) {
          ??? String val = file.trim();
          ??? fileName = val;
          ?}
          其它的屬性,如MaxFileSize ,也相同
          ?
          5.?????? 配置器調(diào)用 activateOptions() 方法。在所有屬性都已設(shè)置好之后,框架就會(huì)調(diào)用這個(gè)方法。
          OptionHandler 接口定義了activateOptions()方法,在全部屬性設(shè)置好了之后,在該方法中進(jìn)行必要的操作,如打開文件
          e.g
          if(fileName != null) {
          ????? try {
          ??? setFile(fileName, fileAppend, bufferedIO, bufferSize);
          ????? }
          ????? catch(java.io.IOException e) {
          ??? errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.",
          ??????????? ?? e, ErrorCode.FILE_OPEN_FAILURE);
          ????? }
          ??? } else {
          ????? //LogLog.error("File option not set for appender ["+name+"].");
          ????? LogLog.warn("File option not set for appender ["+name+"].");
          ????? LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
          }
          ?
          6.?????? Appender 準(zhǔn)備就緒。 此刻,框架可以調(diào)用 append() 方法來處理日志記錄請(qǐng)求。這個(gè)方法由 AppenderSkeleton.doAppend() 方法調(diào)用。
          該方法為Appender中最關(guān)鍵的方法,append()中可以定義日志的輸出,最簡單的:
          protected void append(LoggingEvent event){
          ??? //if layout is required
          ??? System.out.println(this.getLayout().format(event));
          }
          ?
          7.?????? 最后,關(guān)閉appender。 當(dāng)框架即將要?jiǎng)h除您的自定義 appender 實(shí)例時(shí),它會(huì)調(diào)用您的 appender 的 close() 方法。 close() 是一個(gè)清理方法,意味著 您需要釋放已分配的所有資源。它是一個(gè)必需的方法,并且不接受任何參數(shù)。它必須把 closed 字段設(shè)置為 true ,并在有人嘗試使用關(guān)閉的 appender 時(shí)向框架發(fā)出警報(bào)。
          public void close() {
          ??????? if (this.closed)
          ??????????? return;
          ??????? this.closed = true;
          ??? }
          ??? 注意: 需要在主程序退出前,調(diào)用Logger.getRoot().removeAllAppender();這樣才能調(diào)用Appender的close()方法.
          ?
          編寫自定義appender 的 步驟
          1.?????? 擴(kuò)展 AppenderSkeleton 抽象類。
          2.?????? 指定您的 appender 是否需要 layout。
          3.?????? 如果某些屬性必須同時(shí)激活,則應(yīng)該在 activateOptions() 方法內(nèi)完成。
          4.?????? 實(shí)現(xiàn) close() 方法。它必須把 closed 字段的值設(shè)置為 true 。記得釋放所有資源。
          5.?????? 可選地指定要使用的默認(rèn) ErrorHandler 對(duì)象。系統(tǒng)默認(rèn)為OnlyOnceErrorHandler,它發(fā)送出第一個(gè)錯(cuò)誤的消息并忽略其余的所有錯(cuò)誤,錯(cuò)誤消息將輸出到 System.err。
          6.???????? 編寫 append() 方法的代碼。這個(gè)方法負(fù)責(zé)附加日志記錄事件,并在錯(cuò)誤發(fā)生時(shí)負(fù)責(zé)調(diào)用錯(cuò)誤處理程序。
          posted on 2007-01-25 19:25 特蘭克斯 閱讀(3912) 評(píng)論(0)  編輯  收藏 所屬分類: Log

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙山县| 平安县| 会泽县| 朝阳县| 沭阳县| 海盐县| 剑阁县| 聊城市| 额敏县| 青州市| 肥城市| 扶绥县| 铁岭县| 东乌珠穆沁旗| 天水市| 康平县| 康保县| 祁连县| 荣昌县| 枣强县| 阳高县| 青海省| 同仁县| 通山县| 湘潭市| 凉城县| 灵武市| 叙永县| 无锡市| 新绛县| 正阳县| 基隆市| 五河县| 兴文县| 景泰县| 苏尼特左旗| 禄丰县| 乐都县| 鄂托克前旗| 凤庆县| 阿勒泰市|