如何配置Logback以过滤掉任何没有特定标记的内容

时间:2015-07-25 15:00:57

标签: logback marker

这一定是一件简单的事情,但我没有得到它。

我有一个标记,说我在记录时使用的“性能”。此外,当日志消息的构建成本很高时,我经常使用isDebugEnabled()等。

现在我想配置我可以做以下两件事的回溯:

1)记录Logger foo.Bar中所有调试或更高版本的语句并使用标记“performance”

2)记录所有调试或更高版本的Logger中的所有语句,并使用标记“performance”

要实现1)我试过这个:

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
  <Marker>index-control-flow</Marker>
  <OnMatch>ACCEPT</OnMatch>
</turboFilter>

<logger name="foo.Bar" level="DEBUG"/>

然后,所有未使用此标记标记的日志消息也会显示在日志中。

要实现2)我尝试省略上面的记录器行并且只获得带有标记的日志消息,但是,通过检查isDebugEnabled()保护的所有日志消息都被省略。

2 个答案:

答案 0 :(得分:1)

在logback-users邮件列表和更多RTFM的帮助下,我得到了它。

将此示例改为此处,

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
  <Marker>index-control-flow</Marker>
  <OnMismatch>DENY</OnMismatch>
</turboFilter>

与isDebugEnabled(Marker)一起设置各个记录器的级别为我提供了1)的解决方案(不完全但足够好)

与OnMatch ACCEPT相同,为我提供了2)

的设置

答案 1 :(得分:0)

完成第一步的最佳选择是添加一个实现您的标准的自定义Turbo过滤器。我已经从我的一个Scala过滤器中调整了这个,它做了一些非常相似的事情。

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class ConditionalTurboFilter
  extends TurboFilter
{
  @Override
  public FilterReply 
  decide(Marker marker, 
         Logger logger, 
         Level level, 
         String format, 
         Object[] params, 
         Throwable t) 
  {
    if (marker != targetMarker) {
      return FilterReply.DENY;
    }
    if (!level.isGreaterOrEqual(targetLevel)) {
      return FilterReply.DENY;
    }
    if (targetLogger == null) {
      return FilterReply.NEUTRAL;
    }
    else if (targetLogger != logger.getName()) {
      return FilterReply.DENY;
    }
    return FilterReply.NEUTRAL;
  }

  void setMarker(String str)
  {
    if (str != null && str.trim().length() > 0) {
      targetMarker = MarkerFactory.getMarker(str);
    }
  }

  void setLevel(String str)
  {
    if (str != null && str.trim().length() > 0) {
      targetLevel = Level.toLevel(str, Level.ALL);
    }
  }

  void setLogger(String logger) 
  {
    targetLogger = logger;
  }

  @Override
  public void 
  start() 
  {
    if (targetMarker != null && targetLevel != null) {
      super.start();
    }
  }

  private Marker targetMarker;
  private Level targetLevel;
  private String targetLogger;
}

然后使用它,你会这样做:

<turboFilter class="com.yoursite.project.logback.ConditionalTurboFilter">
  <Marker>index-control-flow</Marker>
  <Level>DEBUG</Level>
  <Logger>foo.Bar</Logger>
</turboFilter>