logback?EvaluatorFilter日志過(guò)濾器源碼解讀
序
本文主要研究一下logback的EvaluatorFilter
EvaluatorFilter
ch/qos/logback/core/filter/EvaluatorFilter.java
public class EvaluatorFilter<E> extends AbstractMatcherFilter<E> {
EventEvaluator<E> evaluator;
@Override
public void start() {
if (evaluator != null) {
super.start();
} else {
addError("No evaluator set for filter " + this.getName());
}
}
public EventEvaluator<E> getEvaluator() {
return evaluator;
}
public void setEvaluator(EventEvaluator<E> evaluator) {
this.evaluator = evaluator;
}
public FilterReply decide(E event) {
// let us not throw an exception
// see also bug #17.
if (!isStarted() || !evaluator.isStarted()) {
return FilterReply.NEUTRAL;
}
try {
if (evaluator.evaluate(event)) {
return onMatch;
} else {
return onMismatch;
}
} catch (EvaluationException e) {
addError("Evaluator " + evaluator.getName() + " threw an exception", e);
return FilterReply.NEUTRAL;
}
}
}EvaluatorFilter繼承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)為true時(shí)返回onMatch,否則返回onMismatch,異常的話返回NEUTRAL
EventEvaluator
ch/qos/logback/core/boolex/EventEvaluator.java
public interface EventEvaluator<E> extends ContextAware, LifeCycle {
/**
* Evaluates whether the event passed as parameter matches some user-specified
* criteria.
*
* <p>
* The <code>Evaluator</code> is free to evaluate the event as it pleases. In
* particular, the evaluation results <em>may</em> depend on previous events.
*
* @param event The event to evaluate
* @return true if there is a match, false otherwise.
* @throws NullPointerException can be thrown in presence of null values
* @throws EvaluationException may be thrown during faulty evaluation
*/
boolean evaluate(E event) throws NullPointerException, EvaluationException;
/**
* Evaluators are named entities.
*
* @return The name of this evaluator.
*/
String getName();
/**
* Evaluators are named entities.
*/
void setName(String name);
}EventEvaluator接口定義了evaluate、getName、setName方法
EventEvaluatorBase
ch/qos/logback/core/boolex/EventEvaluatorBase.java
abstract public class EventEvaluatorBase<E> extends ContextAwareBase implements EventEvaluator<E> {
String name;
boolean started;
public String getName() {
return name;
}
public void setName(String name) {
if (this.name != null) {
throw new IllegalStateException("name has been already set");
}
this.name = name;
}
public boolean isStarted() {
return started;
}
public void start() {
started = true;
}
public void stop() {
started = false;
}
}EventEvaluatorBase聲明實(shí)現(xiàn)EventEvaluator,它主要是定義了name、started屬性,另外還有一個(gè)抽象子類為EventEvaluatorBase,而JaninoEventEvaluatorBase抽象子類繼承了EventEvaluatorBase,它們有基于IAccessEvent,也有基于ILoggingEvent。
OnMarkerEvaluator
ch/qos/logback/classic/boolex/OnMarkerEvaluator.java
public class OnMarkerEvaluator extends EventEvaluatorBase<ILoggingEvent> {
List<String> markerList = new ArrayList<String>();
public void addMarker(String markerStr) {
markerList.add(markerStr);
}
/**
* Return true if event passed as parameter contains one of the specified
* user-markers.
*/
public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException {
List<Marker> markerListInEvent = event.getMarkerList();
if (markerListInEvent == null || markerListInEvent.isEmpty()) {
return false;
}
for (String markerStr : markerList) {
for (Marker markerInEvent : markerListInEvent) {
if (markerInEvent.contains(markerStr)) {
return true;
}
}
}
return false;
}
}OnMarkerEvaluator繼承了EventEvaluatorBase,其evaluate從ILoggingEvent獲取markerListInEvent,然后判斷markerListInEvent是否有包含指定的markerStr
OnErrorEvaluator
ch/qos/logback/classic/boolex/OnErrorEvaluator.java
public class OnErrorEvaluator extends EventEvaluatorBase<ILoggingEvent> {
/**
* Return true if event passed as parameter has level ERROR or higher, returns
* false otherwise.
*/
public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException {
return event.getLevel().levelInt >= Level.ERROR_INT;
}
}OnErrorEvaluator繼承了EventEvaluatorBase,其evaluate方法根據(jù)event的level來(lái)判斷看是否大于等于ERROR級(jí)別
JaninoEventEvaluatorBase
ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java
abstract public class JaninoEventEvaluatorBase<E> extends EventEvaluatorBase<E> {
static Class<?> EXPRESSION_TYPE = boolean.class;
static Class<?>[] THROWN_EXCEPTIONS = new Class[1];
static public final int ERROR_THRESHOLD = 4;
static {
THROWN_EXCEPTIONS[0] = EvaluationException.class;
}
private String expression;
ScriptEvaluator scriptEvaluator;
private int errorCount = 0;
public void start() {
try {
assert context != null;
scriptEvaluator = new ScriptEvaluator(getDecoratedExpression(), EXPRESSION_TYPE, getParameterNames(),
getParameterTypes(), THROWN_EXCEPTIONS);
super.start();
} catch (Exception e) {
addError("Could not start evaluator with expression [" + expression + "]", e);
}
}
public boolean evaluate(E event) throws EvaluationException {
if (!isStarted()) {
throw new IllegalStateException("Evaluator [" + name + "] was called in stopped state");
}
try {
Boolean result = (Boolean) scriptEvaluator.evaluate(getParameterValues(event));
return result;
} catch (Exception ex) {
errorCount++;
if (errorCount >= ERROR_THRESHOLD) {
stop();
}
throw new EvaluationException("Evaluator [" + name + "] caused an exception", ex);
}
}
//......
}JaninoEventEvaluatorBase在start的時(shí)候先通過(guò)getDecoratedExpression獲取修飾之后的表達(dá)式,然后創(chuàng)建ScriptEvaluator,evaluate方法則通過(guò)getParameterValues從event提取參數(shù),然后通過(guò)scriptEvaluator.evaluate獲取結(jié)果
示例
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>consoleOnly</marker>
</evaluator>
<onMatch>DENY</onMatch>
</filter>這里配置了EvaluatorFilter,其evaluator為OnMarkerEvaluator,包含consoleOnly這個(gè)marker時(shí)返回true,命中返回DENY
小結(jié)
logback的EvaluatorFilter繼承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)為true時(shí)返回onMatch,否則返回onMismatch,異常的話返回NEUTRAL。evaluator主要有OnMarkerEvaluator、OnErrorEvaluator以及JaninoEventEvaluatorBase系列的evaluator;JaninoEventEvaluatorBase它可以定義expression,通過(guò)ScriptEvaluator進(jìn)行evaluate。
以上就是logback EvaluatorFilter日志過(guò)濾器源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于logback EvaluatorFilter日志過(guò)濾器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring @value和@PropertySource注解使用方法解析
這篇文章主要介紹了Spring @value和@PropertySource注解使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05
java集合中HashSet LinkedHashSet TreeSet三者異同面試精講
這篇文章主要為大家介紹了java集合中HashSet LinkedHashSet TreeSet三者異同面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)
這篇文章主要介紹了gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì)
這篇文章主要介紹了在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
在 Spring Boot 中使用 @Autowired和 @Bean
本文通過(guò)一個(gè)示例演示了如何在SpringBoot中使用@Autowired和@Bean注解進(jìn)行依賴注入和Bean管理,示例中定義了一個(gè)Student類,并通過(guò)配置類TestConfig初始化Student對(duì)象,在測(cè)試類中,通過(guò)@Autowired注解自動(dòng)注入Student對(duì)象并輸出其屬性值,感興趣的朋友跟隨小編一起看看吧2025-02-02
spring boot mybatis多數(shù)據(jù)源解決方案過(guò)程解析
這篇文章主要介紹了spring boot mybatis多數(shù)據(jù)源解決方案過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

