014_logback中的SiftingAppender
1. 如其名, SiftingAppender能按照給定的運行時屬性, 對記錄進行分離或篩選。例如, SiftingAppender能根據(jù)用戶會話對記錄事件進行分離, 這樣, 每個用戶生成的記錄會進入不同的記錄文件, 一個用戶一個文件。
2. SiftingAppender內(nèi)置并且管理多個appender, 這些appender是按照區(qū)別值(discriminating value)而動態(tài)構(gòu)建的。在配置文件里的SiftingAppender定義的內(nèi)部, 指定構(gòu)建好的appender。默認情況下, SiftingAppender用MDC的鍵/值對作為鑒別器(discriminator)。
3. SiftingAppender配置
<appender name="sift" class="ch.qos.logback.classic.sift.SiftingAppender"> <discriminator> <Key>userid</Key> <DefaultValue>unknown</DefaultValue></discriminator> <sift class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"> <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender"> <File>${userid}.log</File> <Append>true</Append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><Pattern>%-4relative [%thread] %-5level - %msg%n</Pattern></encoder></appender></sift> </appender>4. 如果沒有指定class屬性, 則默認為"MDCBasedDiscriminator"(ch.qos.logback.classic.sift.MDCBasedDiscriminator), 它用"Key"屬性關(guān)聯(lián)的MDC值作為鑒別器。如果值為null, 則使用"DefaultValue"關(guān)聯(lián)的值。
5. SiftingAppender是唯一能夠引用和配置嵌套appender的appender。在上面的例子里, 在SiftingAppender里有嵌套的FileAppender實例, 每個實例都用MDC鍵"userid"所關(guān)聯(lián)的值作標識。每當MDC鍵"userid"關(guān)聯(lián)一個新值時, 就會從頭創(chuàng)建一個新的FileAppender實例。SiftingAppender監(jiān)視被它創(chuàng)建的appender, 如果appender在30分鐘內(nèi)沒被使用, 則會被自動關(guān)閉和丟棄。僅擁有不同的appender實例是不夠得, 每個實例還必須輸出到不同的資源。為實現(xiàn)這種差異, 在嵌套appender(上面的FileAppender)里, 傳遞給鑒別器的鍵(上面的"userid")變成了變量。所以, 這個變量可用來區(qū)分嵌套appender所使用的實際資源。
6. 例子
6.1.?新建一個名為SiftingAppender的Java項目, 同時添加相關(guān)jar包
6.2.?在src目錄下新建logback.xml
<configuration debug="true"><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%-4relative [%thread] %-5level - %msg%n</pattern></encoder></appender><appender name="sift" class="ch.qos.logback.classic.sift.SiftingAppender"> <discriminator> <Key>userid</Key> <DefaultValue>unknown</DefaultValue></discriminator> <sift class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"> <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender"> <File>${userid}.log</File> <Append>true</Append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><Pattern>%-4relative [%thread] %-5level - %msg%n</Pattern></encoder></appender></sift></appender><root level="debug"><appender-ref ref="stdout" /><appender-ref ref="sift" /></root></configuration>6.3.?新建Sifting.java
package com.fj;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC;public class Sifting {private static final Logger logger = LoggerFactory.getLogger(Sifting.class);public static void main(String[] args) {logger.error("如其名, SiftingAppender能按照給定的運行時屬性, 對記錄進行分離或篩選。");logger.warn("例如, SiftingAppender能根據(jù)用戶會話對記錄事件進行分離, ");logger.info("這樣, 每個用戶生成的記錄會進入不同的記錄文件, 一個用戶一個文件。");logger.debug("SiftingAppender內(nèi)置并且管理多個appender");MDC.put("userid", "100001");logger.error("這些appender是按照區(qū)別值(discriminating value)而動態(tài)構(gòu)建的。");logger.warn("在配置文件里的SiftingAppender定義的內(nèi)部, 指定構(gòu)建好的appender。");logger.info("默認情況下, SiftingAppender用MDC的鍵/值對作為鑒別器(discriminator)。");logger.debug("如果沒有指定class屬性, 則默認為\\\"MDCBasedDiscriminator\\\"");MDC.put("userid", "100002");logger.error("(ch.qos.logback.classic.sift.MDCBasedDiscriminator)");logger.warn("它用\\\"Key\\\"屬性關(guān)聯(lián)的MDC值作為鑒別器。");logger.info("如果值為null, 則使用\"DefaultValue\"關(guān)聯(lián)的值。");logger.debug("SiftingAppender是唯一能夠引用和配置嵌套appender的appender。");} }6.4.?運行項目控制臺輸出
6.5.?同時生成了unknown.log、100001.log和100002.log三個日志文件
總結(jié)
以上是生活随笔為你收集整理的014_logback中的SiftingAppender的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 013_logback中的SyslogA
- 下一篇: 015_logback中的自定义Appe