Logback的SiftingAppender的后备追加器

时间:2018-01-08 21:43:30

标签: java logging logback sifting-appender

对于SiftingAppender设置,当MDC密钥设置为默认值时,有没有办法引用回退追加器?

例如,当MDC键设置为不同于默认值的值时,我想使用文件appender,但是当MDC键设置为默认值时,请登录到控制台。

我现在看到的唯一解决方案是继承SiftingAppender类并覆盖append(E event)逻辑,以便在MDC密钥设置为默认值时回退到默认的appender。

1 个答案:

答案 0 :(得分:2)

您可以使用Logback filters以互斥条件过滤SiftingAppenderConsoleAppender

示例过滤器声明:

  • 使用Groovy表达“包含默认MDC密钥'条件:

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <!-- GEventEvaluator requires Groovy -->
         <evaluator
            class="ch.qos.logback.classic.boolex.GEventEvaluator">
           <expression>
             mdc.get("servicekey") == null
           </expression>
         </evaluator>
         <OnMismatch>NEUTRAL</OnMismatch>
         <OnMatch>DENY</OnMatch>
    </filter>
    
  • 使用Janino表示包含默认MDC密钥&#39;条件:

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
         <!-- JaninoEventEvaluator requires Janino -->
         <evaluator
           class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
           <expression>
             mdc.get("yourMdcKey") == null
           </expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter>  
    

假设您选择Janino过滤器,那么您的appender将声明如下::

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
         <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
           <expression>
             mdc.get("yourMdcKey") == null
           </expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter> 

    ...

</appender> 

<appender name="SIFTER" class="ch.qos.logback.classic.sift.SiftingAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
         <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
           <expression>
             mdc.get("yourMdcKey") == null
           </expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter> 

    ...

</appender> 

注意:在上面的示例中,我使用mdc.get("yourMdcKey") == null / mdc.get("yourMdcKey") != null来表示此条件:是否将MDC密钥设置为默认值?。您的默认值可能不是null,但可能是一些填充值,如果是这样,那么您将相应地更改条件语句。

这种方法允许您在appender前面声明一个门,这个门应用以下测试:

  • 对于FileAppender如果未填充MDC密钥,则忽略该事件,否则接受该事件
  • 对于SiftingAppender如果未填充MDC密钥,则忽略该事件,否则接受该事件