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內容如下:
這時若報log4j.dtd的錯誤,則需要將log4j.dtd檔案拷貝到xml配置檔案目錄中,log4j.dtd檔案在log4j的jar包的org\apache\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> <root> <priority value ="error"/> <appender-ref ref="myConsole"/> </root> </log4j:configuration>
執行程式輸出為:
[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"/>