5

所以我对 Logback 真的很陌生,并且有一个关于我应该如何实现某些东西的问题。

假设我有两个附加器:我希望附加器“a”接受只有 1 或 2 的标记,但我希望附加器“b”接受只有 1 或 3 的标记。我应该使用什么类型的过滤器?有什么办法吗?

4

2 回答 2

5

一种选择是使用Event Evaluator。您也可以编写自己的过滤器;实际上,内置示例(几乎)可以满足您的需求。

下面的过滤器应该接近您要查找的内容。

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

请注意,我没有对此进行测试。

于 2011-05-05T03:34:39.420 回答
2

乌利亚的回答很棒!

而且我认为扩展 AbstractMatcherFilter 可能是一个更好的开始。

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>

您应该覆盖 AbstractMatcherFilter 中的决定,只需将 markerToMatch.contains(marker) 替换为您的逻辑,并决定匹配哪个标记(即接受)。

用法:

log.info(MarkerFacotry.getMarker("YOUR_MARKER"), "---msg---");
于 2012-01-06T14:19:21.467 回答