2011-05-05 12 views
5

Así que soy nuevo en Logback y tengo una pregunta sobre cómo debo implementar algo.Marcadores en Logback

Digamos que tengo dos appenders: y quiero que el appender "a" acepte marcadores que son solo 1 o 2, pero quiero que el apéndice "b" acepte marcadores que son solo 1 o 3. ¿Qué tipo de filtro debería? ¿Yo suelo? ¿Hay algo para esto?

Respuesta

5

Una opción es utilizar el Event Evaluator. También puedes escribir tu propio filtro; de hecho, el built-in example hace (casi) lo que quiere.

El filtro de abajo debe estar cerca de lo que busca.

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; 
     } 
    } 
} 

Tenga en cuenta que no he probado esto.

2

¡La respuesta de Uriah es genial!

Y pienso para extender AbstractMatcherFilter puede ser un mejor comienzo.

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> 

Usted debe decidir anular en AbstractMatcherFilter, basta con sustituir markerToMatch.contains (marcador) con su lógica, y decidir qué marcador se corresponde (es decir., Aceptada).

uso:

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