Logback中的标记对于根据其上下文(由标记提供)过滤事件非常有用。通常我使用TurboFilter来摆脱已经(或者没有)与之关联的某个标记的记录事件:
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>Data</Marker>
<OnMatch>DENY</OnMatch>
</turboFilter>
现在,我有一个特殊的用例,我希望过滤掉所有与 no Marker关联的日志记录事件。可能通过为每个使用的标记提供一系列TurboFilter,允许匹配并传递(如果不是),但这可能会导致一个相当大且繁琐的配置,每次新标记时都必须更新引入的。
长话短说:有没有一种简单的方法可以过滤掉不带有标记的所有Logback日志记录事件?
答案 0 :(得分:0)
由于无法实现这一目标,我最终实现了自己的Filter,这对于这个用例来说非常简单:
public class NoMarkerFilter extends MatchingFilter {
@Override
public FilterReply decide(final Marker marker, final Logger logger, final Level level, final String format,
final Object[] params, final Throwable t) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
if (marker == null) {
return onMatch;
}
return onMismatch;
}
然后可以在以下配置中使用它:
<turboFilter class="com.example.NoMarkerFilter">
<OnMatch>DENY</OnMatch>
</turboFilter>
答案 1 :(得分:0)
您也可以使用:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>marker == null</expression>
</evaluator>
</filter>
请不要忘记导入janino依赖项,否则您的应用程序将无法启动(有可能不会显示任何日志)