2011-05-05 15 views
5

Bu yüzden Logback konusunda gerçekten yeniyim ve bir şeyleri uygulamak için nasıl gitmem gerektiğiyle ilgili bir sorum var.Logback'deki İşaretler

İki ekleyicim olduğunu varsayalım: ve ben yalnızca 1 veya 2 olan işaretçileri kabul etmek için "a" ekini istedim, ancak yalnızca 1 veya 3 olan işaretçileri kabul etmek için "b" işareti ekleyeni istiyorum. Ne tür bir filtre gerekir Kullanırım? Bunun için bir şey var mı?

cevap

5

Bir seçenek Event Evaluator kullanmaktır. Kendi filtrenizi de yazabilirsiniz; Aslında built-in example istediğini yapar (neredeyse).

Aşağıdaki filtre, aradığınız şeye yakın olmalıdır.

import ch.qos.logback.classic.spi.LoggingEvent; 
import ch.qos.logback.core.filter.Filter; 
import ch.qos.logback.core.spi.FilterReply; 
import org.slf4j.Marker; 
import org.slf4j.MarkerFactory; 

import java.util.ArrayList; 
import java.util.List; 

public class OneTwoMarkerFilter extends Filter 
{ 
    private final List<Marker> markers = new ArrayList<Marker>(); 

    public MarkerFilter() 
    { 
     markers.add(MarkerFactory.getMarker("1")); 
     markers.add(MarkerFactory.getMarker("2")); 
    } 

    @Override 
    public FilterReply decide(Object event) 
    { 
     if (!isStarted()) 
     { 
      return FilterReply.NEUTRAL; 
     } 

     LoggingEvent logEvent = (LoggingEvent) event; 

     Marker eventMarker = logEvent.getMarker(); 

     if (eventMarker != null && markers.contains(eventMarker)) 
     { 
      return FilterReply.NEUTRAL; 
     } 
     else 
     { 
      return FilterReply.DENY; 
     } 
    } 
} 

Lütfen bunu test etmediğimi unutmayın.

2

Uriah'ın cevabı harika!

Özetle, AbstractMatcherFilter'ın daha iyi bir başlangıç ​​olabileceğini düşünüyorum.

public class MarkerFilter extends AbstractMatcherFilter<ILoggingEvent> { 
    private Marker markerToMatch = null; 
    @Override 
    public void start() { 
        if (null != this.markerToMatch) 
            super.start(); 
         else 
            addError("!!! no marker yet !!!"); 
    } 
    @Override 
    public FilterReply decide(ILoggingEvent event) { 
        Marker marker = event.getMarker(); 
        if (!isStarted()) 
            return FilterReply.NEUTRAL; 
        if (null == marker) 
            return onMismatch; 
        if (markerToMatch.contains(marker)) 
            return onMatch; 
        return onMismatch; 
    } 
    public void setMarker(String markerStr) { 
        if(null != markerStr) 
            markerToMatch = MarkerFactory.getMarker(markerStr); 
    } 
} 

<filter class="your.pkg.MarkerFilter"> 
    <marker>YOUR_MARKER</marker> 
    <onMatch>ACCEPT</onMatch> 
    <onMismatch>DENY</onMismatch> 
</filter> 

Sadece kendi mantığı ile markerToMatch.contains (işaretleyici) değiştirin, AbstractMatcherFilter karar geçersiz ve (yani. Kabul) eşleştirilir hangi işaretleyici karar vermelidir.

kullanımı:

log.info(MarkerFacotry.getMarker("YOUR_MARKER"), "---msg---"); 
İlgili konular