过滤掉没有标记的事件

时间:2015-03-13 11:05:53

标签: java logging logback

Logback中的标记对于根据其上下文(由标记提供)过滤事件非常有用。通常我使用TurboFilter来摆脱已经(或者没有)与之关联的某个标记的记录事件:

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    <Marker>Data</Marker>
    <OnMatch>DENY</OnMatch>
</turboFilter>

现在,我有一个特殊的用例,我希望过滤掉所有与 no Marker关联的日志记录事件。可能通过为每个使用的标记提供一系列TurboFilter,允许匹配并传递(如果不是),但这可能会导致一个相当大且繁琐的配置,每次新标记时都必须更新引入的。

长话短说:有没有一种简单的方法可以过滤掉带有标记的所有Logback日志记录事件?

2 个答案:

答案 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依赖项,否则您的应用程序将无法启动(有可能不会显示任何日志)