【发布时间】:2011-05-05 03:10:09
【问题描述】:
所以我真的是 Logback 的新手,并且有一个关于我应该如何实施某些东西的问题。
假设我有两个附加程序: 我希望 appender "a" 接受只有 1 或 2 的标记,但我希望 appender "b" 接受只有 1 或 3 的标记。我应该使用什么类型的过滤器?这有什么用吗?
【问题讨论】:
所以我真的是 Logback 的新手,并且有一个关于我应该如何实施某些东西的问题。
假设我有两个附加程序: 我希望 appender "a" 接受只有 1 或 2 的标记,但我希望 appender "b" 接受只有 1 或 3 的标记。我应该使用什么类型的过滤器?这有什么用吗?
【问题讨论】:
一种选择是使用Event Evaluator。您也可以编写自己的过滤器;事实上,built-in example (几乎)可以满足您的需求。
下面的过滤器应该与您要查找的内容接近。
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;
}
}
}
请注意,我没有对此进行测试。
【讨论】:
Uriah 的回答很棒!
而且我认为扩展 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---");
【讨论】: