【问题标题】:how to filter specific class logger in logback.xml?如何过滤 logback.xml 中的特定类记录器?
【发布时间】:2018-07-14 06:14:50
【问题描述】:

我们尝试过滤从一个类生成的日志:

com.websudos.phantom

为了两个目标:

  1. 来自应用程序的所有日志都保存在文件中,但来自此 calss 的日志除外

  2. 此文件中的所有日志都已传输到 graylog。

我们已经使用这个过滤器通过正则表达式过滤了这些日志:

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator>
        <matcher>
        <Name>parameter</Name>
        <regex>Executing query</regex>
    </matcher>
    <expression>parameter.matches(formattedMessage)</expression>
    </evaluator>
    <OnMismatch>DENY</OnMismatch>
    <OnMatch>ACCEPT</OnMatch>
</filter>

这个类的Executing query 正则表达式:com.websudos.phantom

我们不接受将此类的级别设置为OFF,因为我们需要将此日志传输到graylog而不是保存在文件中!

有什么解决办法?

【问题讨论】:

    标签: logback graylog


    【解决方案1】:

    这是一个解决方案:

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
        <expression>logger.equals("com.websudos.phantom")</expression>
      </evaluator>
      <OnMismatch>NEUTRAL</OnMismatch>
      <OnMatch>DENY</OnMatch>
    </filter>
    

    通过将此过滤器添加到任何appander,来自类com.websudos.phantom的日志被忽略

    【讨论】:

      【解决方案2】:

      XML:

      <filter class="com.websudos.loggers.ClassNameFilter">
          <className>com.websudos.phantom</className>
          <onMatch>ACCEPT</onMatch>
      </filter>
      

      Java:

      package com.websudos.loggers;
      
      import ch.qos.logback.classic.spi.ILoggingEvent;
      import ch.qos.logback.core.filter.AbstractMatcherFilter;
      import ch.qos.logback.core.spi.FilterReply;
      
      public class ClassNameFilter extends AbstractMatcherFilter<ILoggingEvent> {
      
          String loggerName;
      
          @Override
          public FilterReply decide(ILoggingEvent event) {
              if (!isStarted()) {
                  return FilterReply.NEUTRAL;
              }
      
              if (event.getLoggerName().equals(loggerName)) {
                  return onMatch;
              } else {
                  return onMismatch;
              }
          }
      
          public void setClassName(String className) {
              this.loggerName = className;
          }
      
          @Override
          public void start() {
              if (this.loggerName != null) {
                  super.start();
              }
          }
      }
      

      您也可以轻松地对其进行修改以检查日志记录级别。示例见ch.qos.logback.classic.filter.LevelFilter

      【讨论】:

        猜你喜欢
        • 2018-05-04
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多