过滤掉没有标记的事件

Filtering out events that have no Marker

Logback 中的标记对于根据上下文(由标记提供)过滤事件非常有用。通常我使用 TurboFilter 来摆脱具有(或不具有)与它们关联的特定标记的日志记录事件:

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

不过现在,我有一个特殊的用例,我想过滤掉所有具有 no 标记的日志记录事件。可能通过为每个使用的标记提供一个 TurboFilters 链来允许匹配并在不匹配时传递,但这可能最终会导致相当大且乏味的配置,每次新标记出现时都必须更新介绍。

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

由于没有办法开箱即用,我最终实现了自己的过滤器,这对于这个用例来说已经足够简单了:

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>

您也可以使用:

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
    <expression>marker == null</expression>
  </evaluator>
</filter>

请不要忘记导入 janino 依赖项,否则您的应用将无法启动(并且可能不会显示任何日志)