在设置的情况下,SiftingAppender
当 MDC 键设置为默认值时,是否可以引用后备附加程序?
例如,我想在 MDC 键设置为不同于默认值的值时使用文件附加程序,但在 MDC 键设置为默认值时登录到控制台。
我现在看到的唯一解决方案是子类化SiftingAppender
该类并覆盖append(E event)
逻辑以在 MDC 键设置为默认值时回退到默认附加程序。
在设置的情况下,SiftingAppender
当 MDC 键设置为默认值时,是否可以引用后备附加程序?
例如,我想在 MDC 键设置为不同于默认值的值时使用文件附加程序,但在 MDC 键设置为默认值时登录到控制台。
我现在看到的唯一解决方案是子类化SiftingAppender
该类并覆盖append(E event)
逻辑以在 MDC 键设置为默认值时回退到默认附加程序。
您可以使用 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
,但可能是一些填充值,如果是这样,那么您将相应地更改条件语句。
这种方法允许您在附加程序前声明一个门,并且此门应用以下测试:
FileAppender
则忽略该事件,否则接受该事件SiftingAppender
则忽略该事件,否则接受该事件