【问题标题】:Markers in LogbackLogback 中的标记
【发布时间】:2011-05-05 03:10:09
【问题描述】:

所以我真的是 Logback 的新手,并且有一个关于我应该如何实施某些东西的问题。

假设我有两个附加程序: 我希望 appender "a" 接受只有 1 或 2 的标记,但我希望 appender "b" 接受只有 1 或 3 的标记。我应该使用什么类型的过滤器?这有什么用吗?

【问题讨论】:

    标签: logging slf4j logback


    【解决方案1】:

    一种选择是使用Event Evaluator。您也可以编写自己的过滤器;事实上,built-in example (几乎)可以满足您的需求。

    下面的过滤器应该与您要查找的内容接近。

    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.FilterReply;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class OneTwoMarkerFilter extends Filter
    {
        private final List<Marker> markers = new ArrayList<Marker>();
    
        public MarkerFilter()
        {
            markers.add(MarkerFactory.getMarker("1"));
            markers.add(MarkerFactory.getMarker("2"));
        }
    
        @Override
        public FilterReply decide(Object event)
        {
            if (!isStarted())
            {
                return FilterReply.NEUTRAL;
            }
    
            LoggingEvent logEvent = (LoggingEvent) event;
    
            Marker eventMarker = logEvent.getMarker();
    
            if (eventMarker != null && markers.contains(eventMarker))
            {
                return FilterReply.NEUTRAL;
            }
            else
            {
                return FilterReply.DENY;
            }
        }
    }
    

    请注意,我没有对此进行测试。

    【讨论】:

      【解决方案2】:

      Uriah 的回答很棒!

      而且我认为扩展 AbstractMatcherFilter 可能是一个更好的开始。

      public class MarkerFilter extends AbstractMatcherFilter<ILoggingEvent> {
          private Marker markerToMatch = null;
          @Override
          public void start() {
              if (null != this.markerToMatch)
                  super.start();
               else
                  addError("!!! no marker yet !!!");
          }
          @Override
          public FilterReply decide(ILoggingEvent event) {
              Marker marker = event.getMarker();
              if (!isStarted())
                  return FilterReply.NEUTRAL;
              if (null == marker)
                  return onMismatch;
              if (markerToMatch.contains(marker))
                  return onMatch;
              return onMismatch;
          }
          public void setMarker(String markerStr) {
              if(null != markerStr)
                  markerToMatch = MarkerFactory.getMarker(markerStr);
          }
      }
      
      <filter class="your.pkg.MarkerFilter">
          <marker>YOUR_MARKER</marker>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
      </filter>
      

      您应该覆盖 AbstractMatcherFilter 中的决定,只需将 markerToMatch.contains(marker) 替换为您的逻辑,然后决定匹配哪个标记(即接受)。

      用法:

      log.info(MarkerFacotry.getMarker("YOUR_MARKER"), "---msg---");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 2018-09-10
        • 2012-12-21
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        相关资源
        最近更新 更多