1. 程式人生 > >自定義log4j的appender

自定義log4j的appender

實現自定義log4j Appender其實很簡單:
1、繼承log4j公共的基類:AppenderSkeleton
2、列印日誌核心方法:abstract protected void append(LoggingEvent event);
3、初始化載入資源:public void activateOptions(),預設實現為空
4、釋放資源:public void close()
5、是否需要按格式輸出文字:public boolean requiresLayout()
正常情況下我們只需要覆蓋append方法即可。然後就可以在log4j中使用了

----------------------------------------------------------超簡單的Java例項---------------------------------------------------------------------
demo程式碼:


Java程式碼

    import org.apache.log4j.AppenderSkeleton;  
    import org.apache.log4j.spi.LoggingEvent;  
      
    public class SystemOutAppender extends AppenderSkeleton {  
      
        private String prefix ;  
          
        @Override  
        protected void append(LoggingEvent event) {  
            System.out.println("###, " + prefix + " : "+ event.getMessage());  
        }  
      
        @Override  
        public void close() {  
            // TODO Auto-generated method stub  
        }  
      
        @Override  
        public boolean requiresLayout() {  
            // TODO Auto-generated method stub  
            return false;  
        }  
      
        public String getPrefix() {  
            return prefix;  
        }  
      
        public void setPrefix(String prefix) {  
            this.prefix = prefix;  
        }  
    }  



Java程式碼

    public static void main(String[] args) {  
        Logger log = LogFactory.getLog("sysoutLog") ;  
        log.info("System.out.print.....") ;  
    }  


log4j.properties 配置
log4j.logger.sysoutLog=INFO, sysout

log4j.appender.sysout=SystemOutAppender
[email protected]
@@


執行main函式,輸出結果
###, @@@ : System.out.print....

------------------------------------------------------------------------整些深奧點的理論------------------------------------------------------------------------------------------------------------

appender
的生命週期 1.appender 例項不存在,或許框架還沒有配置好。
2.框架例項化了一個新的 appender。這發生在配置器類分析配置指令碼中的一個 appender 宣告的時候。配置器類呼叫 Class.newInstance(YourCustomAppender.class) ,這等價於動態呼叫 new YourCustomAppender() 。框架這樣做是為了避免被硬編碼為任何特定的 appender 名稱;框架是通用的,適用於任何 appender。 e.g. log4j.appender.file=org.apache.log4j.RollingFileAppender 3.框架判斷 appender 是否需要 layout。如果該 appender 不需要 layout,配置器就不會嘗試從配置指令碼中載入 layout 資訊。 Appender介面中,有public boolean requiresLayout() 方法,如果return true;則要求layout,需在配置指令碼中設定layout資訊 e.g. log4j.appender.file.layout=org.apache.log4j.PatternLayout 4.Log4j 配置器呼叫 setter 方法。在所有屬性都已設定好之後,框架就會呼叫這個方法。 此時對應RollingFileAppender的每個Field,需要有一個setter方法,在配置指令碼中也要進行設定 e.g. log4j.appender.file.File=<project>.log 對應的在RollingFileAppender中,有 public void setFile(String file) {     String val = file.trim();     fileName = val;  } 其它的屬性,如MaxFileSize,也相同 5.配置器呼叫 activateOptions() 方法。在所有屬性都已設定好之後,框架就會呼叫這個方法。 OptionHandler介面定義了activateOptions()方法,在全部屬性設定好了之後,在該方法中進行必要的操作,如開啟檔案 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 準備就緒。 此刻,框架可以呼叫 append() 方法來處理日誌記錄請求。這個方法由 AppenderSkeleton.doAppend() 方法呼叫。 該方法為Appender中最關鍵的方法,append()中可以定義日誌的輸出,最簡單的: protected void append(LoggingEvent event){     //if layout is required     System.out.println(this.getLayout().format(event)); } 7.最後,關閉appender。 當框架即將要刪除您的自定義 appender 例項時,它會呼叫您的 appender 的 close() 方法。 close() 是一個清理方法,意味著 您需要釋放已分配的所有資源。它是一個必需的方法,並且不接受任何引數。它必須把 closed 欄位設定為 true ,並在有人嘗試使用關閉的 appender 時向框架發出警報。 public void close() {         if (this.closed)             return;         this.closed = true;     } 注意:需要在主程式退出前,呼叫Logger.getRoot().removeAllAppender();這樣才能呼叫Appender的close()方法. 編寫自定義appender 的步驟 1.擴充套件 AppenderSkeleton 抽象類。 2.指定您的 appender 是否需要 layout。 3.如果某些屬性必須同時啟用,則應該在 activateOptions() 方法內完成。 4.實現 close() 方法。它必須把 closed 欄位的值設定為 true 。記得釋放所有資源。 5.可選地指定要使用的預設 ErrorHandler 物件。系統預設為OnlyOnceErrorHandler,它傳送出第一個錯誤的訊息並忽略其餘的所有錯誤,錯誤訊息將輸出到 System.err。 6.編寫 append() 方法的程式碼。這個方法負責附加日誌記錄事件,並在錯誤發生時負責呼叫錯誤處理程式。



相關推薦

WF4.0以上使用代碼完整定義動態生成執行工作流Xaml文件

load 控制 brush 類型 rpv 返回 cap 並且 sco 給大家分享一下,如何完全使用代碼自定義的創建生成工作流文件(用代碼創建Xaml文件),並且動態加載運行所生成的工作流。 工作流生成後 在Xaml文件裏的主要節點如下: 輸入輸出參數 <x

定義maven變量以及maven內置常量

文件 rect 需要 nal tool tdi cto packaging 構建 本文轉自:http://zheng12tian.iteye.com/blog/1770909 在創建Maven工程後,插件配置中通常會用到一些Maven變量,因此需要找個地方對這些變量進行統一

WPF定義輪播控件

cnblogs log .cn 蛋疼 源碼 logs alt files 一個      閑得蛋疼做了一個WPF制作輪播動畫,勉強可以看,寫個隨筆留個腳印。      源碼:有需要的可留言。              效果圖:   WPF

定義MySQL函數

ffffff 現在 sql code begin 函數 limit round 其他 1、MySQL創建函數語法: CREATE   [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter

FastReport調用Delphi中的定義函數

int 加載 自定義函數 調用 create phi tro fast creat //定義一個函數; function SmallToMoney(akey: real): string; begin //‘1234500‘ end; //此處為fastreport

日本程序開發式定義的malloc/free函數(三)-源代碼(ソースコード)

size span 鏈表 pan ppp 附近 efi ret system 這篇文章終於是貼出了我們的源代碼,實現每個功能也是花費了許多時間,大家在編寫的時候可以多花點時間,多嘗試,多看就能寫出來。 老師的要求不能在程序裏面使用malloc,new什麽的,有要求使用鏈表,

vue.js2.0 定義組件初體驗

最新 解綁 然而 blog bool template 警告 rem 組件 理解 組件(Component)是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素, Vue.js 的編譯器為它添加特殊功能。在有些

angular創建定義指令的四種方式

htm mil 成功 評論 utf-8 例如 angularjs size 限制   angular除了內置的部分指令,還可以通過.directive來自定義指令。要調用自定義指令,HTML 元素上需要添加自定義指令名。使用駝峰法來命名一個指令:nsHeader,在調用時使

1. PMD 使用,編譯和定義規則

自定義 pmd 規則 一 PMD簡介PMD是一款代碼靜態檢查工具,可以檢查出很多代碼中潛在的bug以及讓人感到疑惑的代碼,具體大家可以百度下。二 PMD源代碼下載下載地址:https://github.com/pmd/pmd/tree/pmd/5.5.x需要註意的是註意選擇branch,一般選擇最

定義標題欄右鍵菜單

mman size sub append pan prot base rri import 摘自:http://stackoverflow.com/questions/4615940/how-can-i-customize-the-system-menu-of-a-wind

DataGridView使用技巧十:單元格表示值的定義

mes rgs bject 設定 format ebo cep send || 通過CellFormatting事件,可以自定義單元格的表示值。(比如:值為Error的時候,單元格被設定為紅色) 示例: 1 private void dgv_Users_CellForm

jquery的定義事件通過on綁定trigger觸發

測試 觸發 調用示例 事件觸發 我們 trigge spa src margin jquery綁定自定義事件,可以實現預先綁定好一個處理方法,當需要使用的時候利用jquery trigger來觸發自定義事件,以達到方便快捷的目的。我們來假設一個這樣的場景,一個textare

Android RatingBar 定義樣式

android style Android RatingBar 自定義樣式1.先定義Style:<style name="RadingStyle" parent="@android:style/Widget.RatingBar"> <!-- 定義星星圖片 -->

定義 checkbox 新玩法 ?

buttonview自定義 checkbox 新玩法 ?第一步:selector編寫 drawable/selector_checkbox_voice.xml<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="htt

定義監控(阿裏雲&zabbix)

阿裏雲監控 自定義監控 zabbix腳本監控 mysql監控 自定義監控(阿裏雲&zabbix)目前阿裏雲對25端口有限制,無法在阿裏雲上搭建郵件服務器發送告警郵件,如果需要郵件通知,可以采取下面方法:1.開同阿裏雲企業郵箱2.使用阿裏雲監控告警3.第三方zabbix自定義腳本監控一、

在struts2中配置定義攔截器放行多個方法

return med ttr limit ring req tac cat invoke 源碼: 自定義的攔截器類: //自定義攔截器類:LoginInterceptor ; package com.java.action.interceptor; import j

cordova跨平臺app開發02_定義插件開發與安裝

xtend else callback 視頻 方法名 pty ges ray expect 視頻地址:http://t.cn/RacmXiy cordova的自定義插件由js、原生代碼文件(java、oc)、plugin.xml三部分組成。 cordvoa提供了命令來創

題目1004:Median(qsort函數定義cmp函數)

%d font com ron ring scan sort mat .com 題目鏈接:http://ac.jobdu.com/problem.php?pid=1004 詳解鏈接:https://github.com/zpfbuaa/JobduInCPlusPlus

mysql定義函數

host key 是否 ble sea 判斷語句 bin iter str 1、先查看函數功能是否開啟:show variables like ‘%func%‘; 若是未開啟則:SET GLOBAL log_bin_trust_function_creators=1; 關閉

js定義事件模式

ner 例如 ret cti bsp js事件 事件 使用 原型 ---恢復內容開始---   js事件用的最多的就是默認事件。不過有時候需要自定義事件來使用。   參照默認事件的模式,例如click事件,鼠標點擊dom,先觸發click事件,然後執行dom上的事件處理程序