Java 筛选出没有标记的事件

Java 筛选出没有标记的事件,java,logging,logback,Java,Logging,Logback,Logback中的标记对于根据上下文(由标记提供)过滤事件非常有用。通常,我使用TurboFilter来消除具有(或不具有)特定标记的日志事件: <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter"> <Marker>Data</Marker> <OnMatch>DENY</OnMatch> </turboFilter> 资料 否认

Logback中的标记对于根据上下文(由标记提供)过滤事件非常有用。通常,我使用TurboFilter来消除具有(或不具有)特定标记的日志事件:

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

资料
否认
现在,我有一个特殊的用例,我想过滤掉所有没有标记的日志事件。这可能是通过为每个使用的标记提供一系列涡轮过滤器来实现的,如果不允许,则允许进行匹配和传递,但这可能会导致一个相当大且繁琐的配置,在每次引入新标记时都必须进行更新


长话短说:有没有一种简单的方法可以过滤掉所有没有标记的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>

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