LogBack的filter的應用
LogBack Filter
最近在做業務資料的採集。遇到了一個問題,那就是如何通過記錄日誌的方式捕獲需要的業務資料(這裡我需要的是某個物件的json格式的資料)。我們知道如果採用log.info的形式記錄日誌,儘管我們可以寫多個appender讓info級別的日誌資訊輸出到兩個不同的檔案,但是記錄業務資料的檔案裡面也會有其他info級別的日誌資訊。那麼如何過濾呢,就用到了LogBack的filter。
- LogbackFilter介紹
lockback的過濾器可以過濾記錄日誌的內容,然後返回FilterReply型別的列舉類。從而將不符合條件的日誌資訊過濾掉。
Logback提供兩類Filter,一類是Regular Filter;另外一類是Turbo Filter。
Regular Filter主要應用在appeder上,只在appender級別起作用,Appender例項上可以繫結一個Regular Filter例項鏈。Regular Filter繼承實現”ch.qos.logback.core.filter.Filter”類,自定義自己的regular filter需要繼承ch.qos.logback.core.filter.Filter類,並實現decide()方法。
TurboFilter物件繫結到日誌記錄上下文。因此,不僅在使用給定的appender時呼叫它們,而且每次都發出日誌記錄請求。它們的範圍比附加到附加器的過濾器更寬。更重要的是,它們在LoggingEvent物件建立之前被呼叫 。 TurboFilter物件不需要例項化日誌記錄事件來過濾日誌記錄請求。因此,turbo過濾器旨在用於記錄事件的高效能過濾,甚至在建立事件之前。要實現該型別的filter需要繼承ch.qos.logback.classic.turbo.TurboFilter;類具體的實現可參考
- 自定義regular Filter
由於我的業務是指標對info級別的日誌所以沒必要實現全域性的turboFiter,這裡只給出regular Filter的實現
下面是類程式碼
package com.qf58.srm.pub;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
/**
* @Author: WangZhan
* @Description :
* @Date Created in 11:53 2018/7/26.
*/
public class BdLogMessageFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent iLoggingEvent) {
if (iLoggingEvent.getMessage() != null && iLoggingEvent.getMessage().startsWith("{") && iLoggingEvent
.getMessage().endsWith("}")){
return FilterReply.ACCEPT;
}
return FilterReply.DENY;
}
}
下面是logback配置
最後執行自己的程式就可以看到列印效果。