• (转)Spring boot——logback.xml 配置详解(四)<filter>


    文章转载自:http://aub.iteye.com/blog/1101260在此对作者的辛苦表示感谢!

    1 filter的使用

    <filter>:

     Logback的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从而组成任意的复合过滤策略。过滤器很大程度上受到Linux的iptables启发。这里的所谓三值逻辑是说,过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。

    • 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器;
    • 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件;
    • 如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。

    过滤器被添加到<Appender> 中,为<Appender> 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。<Appender> 有多个过滤器时,按照配置顺序执行。

    2 常用的过滤器

    2.1 LevelFilter

    LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点:

    <level>:设置过滤级别

    <onMatch>:用于配置符合过滤条件的操作

    <onMismatch>:用于配置不符合过滤条件的操作

    例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。

    <configuration> 
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
        <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
          <level>INFO</level> 
          <onMatch>ACCEPT</onMatch> 
          <onMismatch>DENY</onMismatch> 
        </filter> 
        <encoder> 
          <pattern> 
            %-4relative [%thread] %-5level %logger{30} - %msg%n 
          </pattern> 
        </encoder> 
      </appender> 
      <root level="DEBUG"> 
        <appender-ref ref="CONSOLE" /> 
      </root> 
    </configuration>

    2.2 ThresholdFilter

    ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。

    当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

    例如:过滤掉所有低于INFO级别的日志。

    <configuration> 
      <appender name="CONSOLE" 
        class="ch.qos.logback.core.ConsoleAppender"> 
        <!-- 过滤掉 TRACE 和 DEBUG 级别的日志--> 
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
          <level>INFO</level> 
        </filter> 
        <encoder> 
          <pattern> 
            %-4relative [%thread] %-5level %logger{30} - %msg%n 
          </pattern> 
        </encoder> 
      </appender> 
      <root level="DEBUG"> 
        <appender-ref ref="CONSOLE" /> 
      </root> 
    </configuration>  

    2.3 EvaluatorFilter

    (没有尝试)

    EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。需要额外的两个JAR包,commons-compiler.jar和janino.jar有以下子节点:

    <evaluator>:

    鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签<expression>,用于配置求值条件。

    求值表达式作用于当前日志,logback向求值表达式暴露日志的各种字段:

     Name       Type         Description

    event LoggingEvent 与记录请求相关联的原始记录事件,下面所有变量都来自event,例如,event.getMessage()返回下面"message"相同的字符串
    message String 日志的原始消息,例如,设有logger mylogger,"name"的值是"AUB",对于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。
    formatedMessage String 日志被各式话的消息,例如,设有logger mylogger,"name"的值是"AUB",对于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化后的消息。
    logger String logger 名。
    loggerContext LoggerContextVO 日志所属的logger上下文。
    level int 级别对应的整数值,所以 level > INFO 是正确的表达式。
    timeStamp long 创建日志的时间戳。
    marker Marker 与日志请求相关联的Marker对象,注意“Marker”有可能为null,所以你要确保它不能是null。
    mdc Map 包含创建日志期间的MDC所有值得map。访问方法是:mdc.get("myKey") 。mdc.get()返回的是Object不是String,要想调用String的方法就要强转,例如,

    ((String) mdc.get("k")).contains("val") .MDC可能为null,调用时注意。

    throwable java.lang.Throwable 如果没有异常与日志关联"throwable" 变量为 null. 不幸的是, "throwable" 不能被序列化。在远程系统上永远为null,对于与位置无关的表达式请使用下面的变量throwableProxy
    throwableProxy IThrowableProxy 与日志事件关联的异常代理。如果没有异常与日志事件关联,则变量"throwableProxy" 为 null. 当异常被关联到日志事件时,"throwableProxy" 在远程系统上不会为null

    <onMatch>:用于配置符合过滤条件的操作

    <onMismatch>:用于配置不符合过滤条件的操作

    例如:过滤掉所有日志消息中不包含“billing”字符串的日志。

    <configuration> 
     
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">       
          <evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator --> 
            <expression>return message.contains("billing");</expression> 
          </evaluator> 
          <OnMatch>ACCEPT </OnMatch>
          <OnMismatch>DENY</OnMismatch>
        </filter> 
        <encoder> 
          <pattern> 
            %-4relative [%thread] %-5level %logger - %msg%n 
          </pattern> 
        </encoder> 
      </appender> 
     
      <root level="INFO"> 
        <appender-ref ref="STDOUT" /> 
      </root> 
    </configuration>

    <matcher> :

    匹配器,尽管可以使用String类的matches()方法进行模式匹配,但会导致每次调用过滤器时都会创建一个新的Pattern对象,为了消除这种开销,可以预定义一个或多个matcher对象,定以后就可以在求值表达式中重复引用。<matcher>是<evaluator>的子标签。

    <matcher>中包含两个子标签,一个是<name>,用于定义matcher的名字,求值表达式中使用这个名字来引用matcher;另一个是<regex>,用于配置匹配条件。

    例如:

    <configuration debug="true"> 
     
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
          <evaluator>         
            <matcher> 
              <Name>odd</Name> 
              <!-- filter out odd numbered statements --> 
              <regex>statement [13579]</regex> 
            </matcher> 
             
            <expression>odd.matches(formattedMessage)</expression> 
          </evaluator> 
          <OnMismatch>NEUTRAL</OnMismatch> 
          <OnMatch>DENY</OnMatch> 
        </filter> 
        <encoder> 
          <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern> 
        </encoder> 
      </appender> 
     
      <root level="DEBUG"> 
        <appender-ref ref="STDOUT" /> 
      </root> 
    </configuration>

    其他Filter不太常用我这里就不讲了,大家可以参见官网。

    中文手册下载:

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/lixuwu/p/5816814.html
Copyright © 2020-2023  润新知