gpt4 book ai didi

java - Logback 的 SiftingAppender 的后备附加程序

转载 作者:行者123 更新时间:2023-12-02 02:23:23 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

过滤器声明示例:

  • 使用 Groovy 表达“包含默认 MDC key ”条件:

    <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 key ”条件:

    <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 key 是否设置为默认值?。您的默认值很可能不是 null,而是可能是某个填充值,如果是这样,那么您将相应地更改条件语句。

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

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

关于java - Logback 的 SiftingAppender 的后备附加程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48158492/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com