0

在设置的情况下,SiftingAppender当 MDC 键设置为默认值时,是否可以引用后备附加程序?

例如,我想在 MDC 键设置为不同于默认值的值时使用文件附加程序,但在 MDC 键设置为默认值时登录到控制台。

我现在看到的唯一解决方案是子类化SiftingAppender该类并覆盖append(E event)逻辑以在 MDC 键设置为默认值时回退到默认附加程序。

4

1 回答 1

2

您可以使用 Logback过滤器SiftingAppender过滤您和您ConsoleAppender的互斥条件。

过滤器声明示例:

  • 使用 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 密钥”条件:

    <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 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,但可能是一些填充值,如果是这样,那么您将相应地更改条件语句。

这种方法允许您在附加程序前声明一个门,并且此门应用以下测试:

  • 如果未填充 MDC 密钥,FileAppender则忽略该事件,否则接受该事件
  • 如果未填充 MDC 密钥,SiftingAppender则忽略该事件,否则接受该事件
于 2018-01-09T08:16:30.213 回答