对于SiftingAppender
设置,当MDC密钥设置为默认值时,有没有办法引用回退追加器?
例如,当MDC键设置为不同于默认值的值时,我想使用文件appender,但是当MDC键设置为默认值时,请登录到控制台。
我现在看到的唯一解决方案是继承SiftingAppender
类并覆盖append(E event)
逻辑,以便在MDC密钥设置为默认值时回退到默认的appender。
答案 0 :(得分:2)
您可以使用Logback filters以互斥条件过滤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密钥&#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密钥,则忽略该事件,否则接受该事件