1. 程式人生 > >log4j詳解 將指定日誌輸出到不同的檔案中

log4j詳解 將指定日誌輸出到不同的檔案中

import org.apache.log4j.Logger;

<span style="font-family: Arial, Helvetica, sans-serif;">public class HelloWorld {</span>
<span style="white-space:pre">	</span>private static Logger logger = Logger.getLogger(HelloWorld.class.getName()); 
    
    public static void main(String[] args) { 
    <span style="white-space:pre">	</span>logger.trace("trace ...");
<span style="white-space:pre">	</span>    logger.debug("Debug ...");
<span style="white-space:pre">	</span>    logger.info("Info ...");
<span style="white-space:pre">	</span>    logger.warn("Warn ...");
<span style="white-space:pre">	</span>    logger.error("Error ...");  
<span style="white-space:pre">	</span>    logger.fatal("Fatal ..."); 
    }  
}

3、新建資料夾config用於存放配置檔案,寫配置檔案log4j.xml。

有以下兩點建議新建config資料夾存放配置檔案:

a、一般專案中用到的配置檔案比較多,有專門的資料夾存放會比較方便。

b、專案打成jar包時,一般不會把配置檔案也打進jar包。

配置檔案log4j內容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >     
     <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern"    
                value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender> 
    <root>  
        <priority value ="error"/>  
        <appender-ref ref="myConsole"/>  
    </root>    
</log4j:configuration> 
這時若報log4j.dtd的錯誤,則需要將log4j.dtd檔案拷貝到xml配置檔案目錄中,log4j.dtd檔案在log4j的jar包的org\apache\log4j\xml資料夾可以找到。

執行程式輸出為:

[2014-09-27 18:16:28,215 ERROR] [main] test.HelloWorld - Error ...
[2014-09-27 18:16:28,215 FATAL] [main] test.HelloWorld - Fatal ...

1、使用專案中所用到的log4j配置檔案說明

寫本文時專案對log4j寫日誌的要求是: a、提供使用者及開發人員看的兩大類日誌。 b、提供給使用者看的日誌只有info級別的資訊並輸出到指定檔案中 c、提供給開發人員用的有debug、warn、error,三個級別的日誌分別輸出到指定檔案中。

1.1 先看配置檔案

log4j.properties配置檔案,配置簡單,但不支援複雜過濾器filter,log4j.xml雖然配置檔案看似複雜,但支援複雜過濾器和Log4j的新特性。推薦使用log4j.xml,本文也只講解log4j.xml的配置。

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
    
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
    
     <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern"    
                value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender>
    
 <span style="white-space:pre">	</span><appender name="user" class="org.apache.log4j.DailyRollingFileAppender">
<span style="white-space:pre">		</span><param name="File" value="files/logs/result.log" />  
<span style="white-space:pre">		</span><param name="Append" value="true"/>
<span style="white-space:pre">		</span><layout class="org.apache.log4j.PatternLayout">  
<span style="white-space:pre">	</span>  <span style="white-space:pre">	</span><param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />  
<span style="white-space:pre">		</span></layout>
<span style="white-space:pre">		</span><filter class="com.test.test.UserLogFilter">     
<span style="white-space:pre">	</span> <span style="white-space:pre">		</span><param name="LevelMin" value="20060" />     
<span style="white-space:pre">	</span>  <span style="white-space:pre">		</span><param name="LevelMax" value="20060" /> 
<span style="white-space:pre">	</span>  <span style="white-space:pre">		</span><param name="acceptOnMatch" value="true" />     
<span style="white-space:pre">		</span></filter>  
<span style="white-space:pre">	</span></appender> 
    
    <appender name="info" class="org.apache.log4j.DailyRollingFileAppender">    
        <param name="File" value="files/logs/info.log" />
        <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->  
        <param name="Append" value="true" />  
<span style="white-space:pre">		</span><param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss\}] - %m%n" />  
        </layout>  
        <!--過濾器設定輸出的級別--> 
        <filter class="org.apache.log4j.varia.LevelRangeFilter">    
<span style="white-space:pre">		</span>   <param name="levelMin" value="INFO" />    
<span style="white-space:pre">		</span>   <param name="levelMax" value="INFO" />    
<span style="white-space:pre">		</span>   <param name="AcceptOnMatch" value="true" />    
<span style="white-space:pre">		</span></filter>
    </appender> 
  
    <appender name="debug" class="org.apache.log4j.DailyRollingFileAppender"> 
      <span style="white-space:pre">	</span><!-- 設定日誌輸出檔名 -->     
        <param name="File" value="files/logs/debug.log" />
        <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->  
        <param name="Append" value="true" />  
<span style="white-space:pre">		</span><param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<span style="white-space:pre">		</span><!-- 指定日誌訊息的輸出最低層次 -->
<span style="white-space:pre">		</span><param name="Threshold" value="debug" />  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender> 
    
    <appender name="warn" class="org.apache.log4j.DailyRollingFileAppender"> 
      <span style="white-space:pre">	</span><!-- 設定日誌輸出檔名 -->     
        <param name="File" value="files/logs/warn.log" />
        <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->  
        <param name="Append" value="true" />  
<span style="white-space:pre">		</span><param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<span style="white-space:pre">		</span><!-- 指定日誌訊息的輸出最低層次 -->
<span style="white-space:pre">		</span><param name="Threshold" value="warn" />  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender> 
    
    <appender name="error" class="org.apache.log4j.DailyRollingFileAppender"> 
      <span style="white-space:pre">	</span><!-- 設定日誌輸出檔名 -->     
        <param name="File" value="files/logs/error.log" />
        <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->  
        <param name="Append" value="true" />  
<span style="white-space:pre">		</span><param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<span style="white-space:pre">		</span><!-- 指定日誌訊息的輸出最低層次 -->
<span style="white-space:pre">		</span><param name="Threshold" value="error" />  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender> 
    
    <!-- 根logger的設定-->  
    <root>  
        <priority value ="debug"/>  
        <appender-ref ref="myConsole"/>  
  <span style="white-space:pre">		</span><appender-ref ref="debug"/>
        <appender-ref ref="info"/>  
        <appender-ref ref="warn"/>
        <appender-ref ref="error"/>
    </root>    
</log4j:configuration> 

1.2、建立所需用到的資料夾及檔案


1.3、編寫測試方法

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jTest {
	static final Logger logger = Logger.getLogger(Log4jTest.class.getName());
	public static void main(String[] args) {	
		PropertyConfigurator.configure("config/log4j.xml");
		logger.trace("trace ...");
	    logger.debug("Debug ...");
	    logger.info("Info ...");
	    logger.warn("Warn ...");
	    logger.error("Error ...");
	}
}

1.4、日誌輸出結果

a、控制檯

[2014-09-27 18:32:51,923 DEBUG] [main] test.Log4jTest - Debug ...
[2014-09-27 18:32:51,923 INFO ] [main] test.Log4jTest - Info ...
[2014-09-27 18:32:51,924 WARN ] [main] test.Log4jTest - Warn ...
[2014-09-27 18:32:51,924 ERROR] [main] test.Log4jTest - Error ...

b、debug日誌

[2014-09-27 18:32:51,923 DEBUG] [main] test.Log4jTest - Debug ...
[2014-09-27 18:32:51,923 INFO ] [main] test.Log4jTest - Info ...
[2014-09-27 18:32:51,924 WARN ] [main] test.Log4jTest - Warn ...
[2014-09-27 18:32:51,924 ERROR] [main] test.Log4jTest - Error ...

c、準備給使用者看的info日誌
[2014-09-27 18:32:51] - Info ...

d、warn日誌

[2014-09-27 18:37:02,224 WARN ] [main] test.Log4jTest - Warn ...
[2014-09-27 18:37:02,225 ERROR] [main] test.Log4jTest - Error ...

  e、error日誌
[2014-09-27 18:37:02,225 ERROR] [main] test.Log4jTest - Error ...

2、log4j理論介紹

Log4j是Apache的一個開放原始碼專案,通過使用Log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件,甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。

Log4j主要有Logger、Appender、Layout三個主要的元件,這三個元件相互配合使得我們可以獲得非常強大的日誌記錄的能力。

Log4j的類層次結構如下:

       

2.1、根類別

根類別在類別層次結構的頂部,即全域性性的日誌級別

配置根Logger,其語法為:

log4j.rootLogger = [ level ] , appenderName, appenderName, ...

level 是日誌記錄的類別,appenderName就是指定日誌資訊輸出到哪個地方。您可以同時指定多個輸出目的地。

類別level 為 OFF、FATAL、ERROR、WARN、INFO、DEBUG、trace、ALL或自定義的優先順序。

og4j常用的優先順序FATAL>ERROR>WARN>INFO>DEBUG

如果為log4j.rootLogger=WARN,則意味著只有WARN,ERROR,FATAL被輸出,DEBUG,INFO將被遮蔽掉。

舉例:log4j.rootCategory=INFO,stdout,Runlog,Errorlog

根日誌類別為INFO,DEBUG將被遮蔽,其他的將被輸出。 stdout,Runlog,Errorlog分別為3個輸出目的地。

2.2、Appender目的地

配置日誌資訊輸出目的地Appender,其語法為

log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN
appenderName就是指定日誌資訊輸出到哪個地方。您可以同時指定多個輸出目的地。

log4j支援的輸出目的地:
org.apache.log4j.ConsoleAppender 控制檯
org.apache.log4j.FileAppender 檔案
org.apache.log4j.DailyRollingFileAppender 每天產生一個日誌檔案
org.apache.log4j.RollingFileAppender (檔案大小到達指定尺寸的時候產生一個新的檔案),
org.apache.log4j.WriterAppender (將日誌資訊以流格式傳送到任意指定的地方) 
org.apache.log4j.net.SMTPAppender 郵件
org.apache.log4j.jdbc.JDBCAppender 資料庫
其他如:GUI元件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等

         a.ConsoleAppender選項 
                Threshold=WARN:指定日誌訊息的輸出最低層次。 
                ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
                Target=System.err:預設情況下是:System.out,指定輸出控制檯 
          b.FileAppender 選項 
               Threshold=WARN:指定日誌訊息的輸出最低層次。 
               ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
               File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
               Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
          c.DailyRollingFileAppender 選項 
               Threshold=WARN:指定日誌訊息的輸出最低層次。 
               ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
               File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
               Append=false:預設值是true,即以追加的方式將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
               DatePattern=''.''yyyy-ww:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下: 
                    1)''.''yyyy-MM: 每月 
                    2)''.''yyyy-ww: 每週  
                    3)''.''yyyy-MM-dd: 每天 
                    4)''.''yyyy-MM-dd-a: 每天兩次 
                    5)''.''yyyy-MM-dd-HH: 每小時 
                    6)''.''yyyy-MM-dd-HH-mm: 每分鐘 
         d.RollingFileAppender 選項 
             Threshold=WARN:指定日誌訊息的輸出最低層次。 
              ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。 
              File=mylog.txt:指定訊息輸出到mylog.txt檔案。 
              Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。 
              MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案。 
              MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。 

2.3、Layout 佈局

log4j提供4種佈局:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊) 常用輸出格式%-Xp %C or $class,  %F or %file,  %l or %location,  %L or %line,  %M or %method

-X號:X資訊輸出時左對齊;
%p:日誌資訊級別
%d{}:日誌資訊產生時間
%c:日誌資訊所在地(類名)
%m:產生的日誌具體資訊
%n:輸出日誌資訊換行

2.4、Filters 過濾器

Filter 可以過濾 log 事件,並控制 log 輸出

上面例子中用到了過濾器LevelRangeFilter,表示只輸出INFO級別的日誌

<pre name="code" class="html" style="color: rgb(54, 46, 43); font-size: 14px; line-height: 19.984375px;">        <filter class="org.apache.log4j.varia.LevelRangeFilter">    
<span style="white-space:pre">		</span>   <param name="levelMin" value="INFO" />    
<span style="white-space:pre">		</span>   <param name="levelMax" value="INFO" />    
<span style="white-space:pre">		</span>   <param name="AcceptOnMatch" value="true" />    
<span style="white-space:pre">	</span></filter>

3、如何自定義log4j的日誌級別並將自定義日誌輸出到指定檔案中

我們的專案需要記不同型別,不同格式,不同級別的日誌。用它來寫日誌很方便,但是我們的專案對日誌的需求有時會超出它本身的處理能力如:serious,checkout等,如果直接用log4j的log.debug(),log.warn()....是不會寫諸如下面這種形式的日誌的:serious:XXXX:20140927checkout:xxxxx:20140927 看了看資料,log4j的日誌級別是通過Level類來實現的,log.warn(Object)實際呼叫的logger.log(Level,Object)方法這樣就好辦了,寫一個類繼承Log4j的Level類,擴充其日誌級別,然後封裝log4j的logger類,在封裝的類中呼叫logger.log(擴充的Level類,Object)就可以了,具體步驟如下: 1)、寫一個類繼承Level,override父類的建構函式,比如我們需要Serious級別。
<pre name="code" class="java">private static class SeriousLevel extends Level {
       private SeriousLevel(int level, String name, int sysLogLevel) {
            super(level, name, sysLogLevel);
       }
}
2)、把這些繼承Level的子類歸到一個介面中,便於統一呼叫
public interface MyLogLevel {
	public static final Level SERIOUS_LEVEL = new SeriousLevel(Priority.ERROR_INT<span style="font-family: verdana, sans-serif;"> + 50</span><span style="font-family: verdana, sans-serif;">, "SERIOUS", SyslogAppender.LOG_LOCAL0);</span>
	public static final Level ALARM_LEVEL = new AlarmLevel(Priority.DEBUG_INT + 50, "ALARM", SyslogAppender.LOG_LOCAL0);
}<span style="font-family: verdana, sans-serif; background-color: rgb(255, 255, 255);"> </span>
3)、封裝Log4j的Logger,新增serious(Object) alarm(Object)等方法,在方法中呼叫Logger.log(Level,Object)來傳入我們自己的日誌level
public class MyLogger {
	private static Logger logger = Logger.getLogger(MyLogger.class);;

	 public static void serious(Object pm_objLogInfo){
		 logger.log(MyLogLevel.SERIOUS_LEVEL,pm_objLogInfo);  
	   /*MyLogLevel介面中的所有自定義日誌級別都繼承自Level*/
	 }
	 
	 public static void alarm(Object pm_objLogInfo){
		 logger.log(MyLogLevel.ALARM_LEVEL,pm_objLogInfo);
	 }
}
4)、寫自定義過濾器
public class MyLogFilter extends Filter{
	boolean acceptOnMatch = false;
	int levelMin;
	int levelMax;

	public int getLevelMin() {
		return levelMin;
	}
	public void setLevelMin(int levelMin) {
		this.levelMin = levelMin;
	}
	public int getLevelMax() {
		return levelMax;
	}
	public void setLevelMax(int levelMax) {
		this.levelMax = levelMax;
	}
	public int decide(LoggingEvent lgEvent) {
		int inputLevel = lgEvent.getLevel().toInt();
		if (inputLevel >= levelMin && inputLevel <= levelMax) {
			return 0;
		}
		return -1;
	}
}

5)、寫配置檔案log4j.xml
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
    
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >  
    
     <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern"    
                value="[%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />  
        </layout>  
    </appender>
    
 	<appender name="serious" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="files/logs/serious.log" />  
		<param name="Append" value="true"/>
		<layout class="org.apache.log4j.PatternLayout">  
	  		<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />  
		</layout>
		<filter class="com.test.test.MyLogFilter">     
	 		<param name="LevelMin" value="40050" />     
	  		<param name="LevelMax" value="40050" /> 
	  		<param name="acceptOnMatch" value="true" />     
		</filter>  
	</appender> 
    
   <appender name="alarm" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="files/logs/alarm.log" />  
		<param name="Append" value="true"/>
		<layout class="org.apache.log4j.PatternLayout">  
	  		<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />  
		</layout>
		<filter class="com.test.test.MyLogFilter">     
	 		<param name="LevelMin" value="10050" />     
	  		<param name="LevelMax" value="10050" /> 
	  		<param name="acceptOnMatch" value="true" />     
		</filter>  
	</appender> 
    
    <!-- 根logger的設定-->  
    <root>  
        <priority value ="debug"/>  
        <appender-ref ref="myConsole"/>  
  		<appender-ref ref="serious"/>
        <appender-ref ref="alarm"/>  
    </root>    
</log4j:configuration> 

6)、寫測試類
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Log4jTest {
	static final Logger logger = Logger.getLogger(Log4jTest.class.getName());
	static final MyLogger log = new MyLogger();
	public static void main(String[] args) {	
		PropertyConfigurator.configure("config/log4j.xml");
		logger.trace("trace ...");
	    logger.debug("Debug ...");
	    logger.info("Info ...");
	    logger.warn("Warn ...");
	    logger.error("Error ...");
	    log.serious("Serious ...");
	    log.alarm("Alarm ...");
	}
}

7)、檢視輸出結果 a、控制檯
log4j:WARN No such property [acceptOnMatch] in com.test.test.MyLogFilter.
[2014-09-27 23:16:26,710 DEBUG] [main] test.Log4jTest - Debug ...
[2014-09-27 23:16:26,710 INFO ] [main] test.Log4jTest - Info ...
[2014-09-27 23:16:26,710 WARN ] [main] test.Log4jTest - Warn ...
[2014-09-27 23:16:26,711 ERROR] [main] test.Log4jTest - Error ...
[2014-09-27 23:16:26,712 SERIOUS] [main] test.MyLogger - Serious ...
[2014-09-27 23:16:26,715 ALARM] [main] test.MyLogger - Alarm ...

b、serious.log
14-09-27 23:16:26 [SERIOUS] com.test.test.MyLogger {MyLogger.java:9} - Serious ...

c、alarm.log
14-09-27 23:16:26 [ALARM] com.test.test.MyLogger {MyLogger.java:14} - Alarm ...

4、log4j其他功能簡介

4.1、log4j 2.0中的過濾器

log4j 2 定義了 10 種Filter。[點我看官網介紹]

1)、BurstFilter

<span style="white-space:pre">	</span><BurstFilter level="INFO" rate="16" maxBurst="100"/>

level :BurstFilter過濾的事件級別
rate :每秒允許的 log 事件的平均值
maxBurst:當BurstFilter過濾的事件超過 rate 值,排隊的 log 事件上限。超過此上限的 log ,將被丟棄。預設情況下 maxBurst = 10*rate
按以上配置,假定每個 log 事件的執行時間較長,輸出 117 個 log 事件( INFO級別)到RollingFileAppenders,BurstFilter會過濾得到INFO級別的 log 事件,之後會發生: 16 個 log 事件在執行, 100 個等待執行, 1 個被丟棄。

  2)CompositeFilter

<span style="font-size:12px;"><span style="white-space:pre">	</span><Filters>
<span style="white-space:pre">		</span><Marker marker="EVENT" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<span style="white-space:pre">		</span><DynamicThresholdFilter key="loginId" defaultThreshold="ERROR"
<span style="white-space:pre">			</span>onMatch="ACCEPT" onMismatch="NEUTRAL">
<span style="white-space:pre">			</span><KeyValuePair key="User1" value="DEBUG"/>
<span style="white-space:pre">		</span></DynamicThresholdFilter>
<span style="white-space:pre">	</span></Filters></span>
不止一個過濾器時可以通過使用一個CompositeFilter。

3)、DynamicThresholdFilter

<span style="white-space:pre">	</span><DynamicThresholdFilter key="loginId" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL">
<span style="white-space:pre">		</span><KeyValuePair key="User1" value="DEBUG"/>
<span style="white-space:pre">	</span></DynamicThresholdFilter>
DynamicThresholdFilter可以過濾具有特定的屬性某一級別的日誌。例如, 
如果使用者的登入ID被捕獲在ThreadContext
的Map中則可以啟用debug級的日誌。

4)、MapFilter

<span style="white-space:pre">	</span><MapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
<span style="white-space:pre">		</span><KeyValuePair key="eventId" value="Login"/>
<span style="white-space:pre">		</span><KeyValuePair key="eventId" value="Logout"/>
<span style="white-space:pre">	</span></MapFilter>
MapFilter可以對Map中的資訊進行過濾,進而記錄特定事件,比如登入、退出。

5)、 MarkerFilter

<span style="white-space:pre">	</span><RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<span style="white-space:pre">		</span><MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>
<span style="white-space:pre">		</span><PatternLayout>
<span style="white-space:pre">			</span><pattern>%d %p %c{1.} [%t] %m%n</pattern>
<span style="white-space:pre">		</span></PatternLayout>
<span style="white-space:pre">		</span><TimeBasedTriggeringPolicy />
<span style="white-space:pre">	</span></RollingFile>

6)、RegexFilter
<span style="white-space:pre">	</span><RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<span style="white-space:pre">		</span><RegexFilter regex=".* test .*" onMatch="ACCEPT" onMismatch="DENY"/>
<span style="white-space:pre">		</span><PatternLayout>
<span style="white-space:pre">			</span><pattern>%d %p %c{1.} [%t] %m%n</pattern>
<span style="white-space:pre">		</span></PatternLayout>
<span style="white-space:pre">		</span><TimeBasedTriggeringPolicy />
<span style="white-space:pre">	</span></RollingFile>

7)、StructuredDataFilter
<span style="white-space:pre">	</span><StructuredDataFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
<span style="white-space:pre">		</span><KeyValuePair key="id" value="Login"/>
<span style="white-space:pre">		</span><KeyValuePair key="id" value="Logout"/>
<span style="white-space:pre">	</span></StructuredDataFilter>

8)、ThreadContextMapFilter
<span style="white-space:pre">	</span><ThreadContextMapFilter onMatch="ACCEPT" onMismatch="NEUTRAL" operator="or">
<span style="white-space:pre">		</span><KeyValuePair key="User1" value="DEBUG"/>
<span style="white-space:pre">		</span><KeyValuePair key="User2" value="WARN"/>
<span style="white-space:pre">	</span></ThreadContextMapFilter>

9)、ThresholdFilter
<span style="white-space:pre">	</span><ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>

10)、TimeFilter

<span style="white-space:pre">	</span><TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>