014_logback中的SiftingAppender
1. 如其名, SiftingAppender能按照給定的運行時屬性, 對記錄進行分離或篩選。例如, SiftingAppender能根據用戶會話對記錄事件進行分離, 這樣, 每個用戶生成的記錄會進入不同的記錄文件, 一個用戶一個文件。
2. SiftingAppender內置并且管理多個appender, 這些appender是按照區別值(discriminating value)而動態構建的。在配置文件里的SiftingAppender定義的內部, 指定構建好的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"屬性關聯的MDC值作為鑒別器。如果值為null, 則使用"DefaultValue"關聯的值。
5. SiftingAppender是唯一能夠引用和配置嵌套appender的appender。在上面的例子里, 在SiftingAppender里有嵌套的FileAppender實例, 每個實例都用MDC鍵"userid"所關聯的值作標識。每當MDC鍵"userid"關聯一個新值時, 就會從頭創建一個新的FileAppender實例。SiftingAppender監視被它創建的appender, 如果appender在30分鐘內沒被使用, 則會被自動關閉和丟棄。僅擁有不同的appender實例是不夠得, 每個實例還必須輸出到不同的資源。為實現這種差異, 在嵌套appender(上面的FileAppender)里, 傳遞給鑒別器的鍵(上面的"userid")變成了變量。所以, 這個變量可用來區分嵌套appender所使用的實際資源。
6. 例子
6.1.?新建一個名為SiftingAppender的Java項目, 同時添加相關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能根據用戶會話對記錄事件進行分離, ");logger.info("這樣, 每個用戶生成的記錄會進入不同的記錄文件, 一個用戶一個文件。");logger.debug("SiftingAppender內置并且管理多個appender");MDC.put("userid", "100001");logger.error("這些appender是按照區別值(discriminating value)而動態構建的。");logger.warn("在配置文件里的SiftingAppender定義的內部, 指定構建好的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\\\"屬性關聯的MDC值作為鑒別器。");logger.info("如果值為null, 則使用\"DefaultValue\"關聯的值。");logger.debug("SiftingAppender是唯一能夠引用和配置嵌套appender的appender。");} }6.4.?運行項目控制臺輸出
6.5.?同時生成了unknown.log、100001.log和100002.log三個日志文件
總結
以上是生活随笔為你收集整理的014_logback中的SiftingAppender的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 013_logback中的SyslogA
- 下一篇: 015_logback中的自定义Appe