过滤掉没有标记的事件
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 依赖项,否则您的应用将无法启动(并且可能不会显示任何日志)
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 依赖项,否则您的应用将无法启动(并且可能不会显示任何日志)