Java 用于Logback筛选appender的不同appender类型

Java 用于Logback筛选appender的不同appender类型,java,logging,slf4j,logback,sifting-appender,Java,Logging,Slf4j,Logback,Sifting Appender,我已经像这样配置了一个筛选附加器: <appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender"> <discriminator> <key>context</key> <defaultValue>global</defaultValue> </discriminator>

我已经像这样配置了一个筛选附加器:

<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender">

    <discriminator>
        <key>context</key>
        <defaultValue>global</defaultValue>
    </discriminator>

    <!-- sift into different files -->
    <sift>
        <appender name="FILE-${context}" class="ch.qos.logback.core.FileAppender">
            <file>${logroot}/${context}.log</file>
            <encoder>
                <pattern>[%d{HH:mm:ss.SSS}] %-5level %logger{36} [%thread]%n%msg%n</pattern>
            </encoder>
        </appender>
    </sift>

</appender>

上下文
全球的
${logroot}/${context}.log
[%d{HH:mm:ss.SSS}]-5级别%logger{36}[%thread]%n%msg%n
现在,我想在那里有一个
RollingFileAppender
,但是只用于没有
上下文的消息。具有
上下文的
通常不是很大,但是全局的是很大的


这可能吗?

如果groovy配置是您的一个选项,我认为您可以使用它来实现这一点。可以基于鉴别器编写if语句

appender("SIFT", GSiftingAppender) {
 discriminator(MDCBasedDiscriminator) {
      key = "context"
      defaultValue = "global"
 }
 sift {
  if(..) {
         appender(....) {
         }
  }
 }
}

我认为在这种情况下最好的方法是扩展SiftingAppender并覆盖append,并抛出任何没有键的内容(而不是使用默认值)

我能想到的最快的方法是创建两个appender并将事件发送给这两个appender。然后将筛选WhileRejectingDefaultAppender配置为使用RollingFileAppender,并将筛选RejectAllButDefaultAppender配置为使用常规FileAppender

在弹出DefaultAppender时筛选

import ch.qos.logback.classic.sift.SiftingAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class SiftingWhileRejectingDefaultAppender extends SiftingAppender {

    @Override
    protected void append(ILoggingEvent event) {
        String discriminatingValue = this.getDiscriminator().getDiscriminatingValue(event);
        if (!discriminatingValue.equals("global")) {
            super.append(event);
        }
    }
}
import ch.qos.logback.classic.sift.SiftingAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class SiftingRejectAllButDefaultAppender extends SiftingAppender {

    @Override
    protected void append(ILoggingEvent event) {
        String discriminatingValue = this.getDiscriminator().getDiscriminatingValue(event);
        if (discriminatingValue.equals("global")) {
            super.append(event);
        }
    }
}
筛选拒绝AllButDefaultAppender

import ch.qos.logback.classic.sift.SiftingAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class SiftingWhileRejectingDefaultAppender extends SiftingAppender {

    @Override
    protected void append(ILoggingEvent event) {
        String discriminatingValue = this.getDiscriminator().getDiscriminatingValue(event);
        if (!discriminatingValue.equals("global")) {
            super.append(event);
        }
    }
}
import ch.qos.logback.classic.sift.SiftingAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class SiftingRejectAllButDefaultAppender extends SiftingAppender {

    @Override
    protected void append(ILoggingEvent event) {
        String discriminatingValue = this.getDiscriminator().getDiscriminatingValue(event);
        if (discriminatingValue.equals("global")) {
            super.append(event);
        }
    }
}

您可以在附加器上使用筛选器。如果使用XML配置尝试此操作,则您的附加器上的筛选器将包括,而其他附加器上的筛选器将排除

,但此操作无效。我得到“在SiftingAppender中的元素中找不到嵌套的appender”,因为它不喜欢“if”。您应该包括如何使用过滤器的实现。