You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除SiftingAppender默认值文件夹,仅保留指定鉴别器键目录?

解决方案

方法1:移除默认值配置,丢弃无鉴别键的日志

直接删除配置里的<defaultValue>Default</defaultValue>项,修改后的配置示例如下:

<appender name="TEST_LOGGER" class="ch.qos.logback.classic.sift.SiftingAppender">
  <discriminator>
    <key>discKey</key>
    <!-- 移除默认值配置 -->
  </discriminator>
  <sift>
    <!-- 嵌套的RollingFileAppender配置示例 -->
    <appender name="FILE-${discKey}" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>logs/${discKey}/test.log</file>
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/${discKey}/test.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
        <maxHistory>30</maxHistory>
      </rollingPolicy>
      <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
    </appender>
  </sift>
</appender>

当MDC中不存在discKey时,SiftingAppender不会创建对应的子Appender,自然不会生成默认文件夹,这类无鉴别键的日志会被直接丢弃。

方法2:自定义鉴别器,仅处理指定鉴别键

如果需要严格限定只生成特定鉴别键对应的文件夹,可自定义鉴别器来过滤非目标值:

  1. 实现ch.qos.logback.core.sift.Discriminator接口,仅返回允许的鉴别键值:
import ch.qos.logback.core.sift.Discriminator;
import org.slf4j.MDC;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class CustomDiscriminator implements Discriminator<ch.qos.logback.classic.spi.ILoggingEvent> {
    private String key = "discKey";
    private Set<String> allowedValues = new HashSet<>();

    @Override
    public String getDiscriminatingValue(ch.qos.logback.classic.spi.ILoggingEvent event) {
        String value = MDC.get(key);
        // 仅返回允许的值,否则返回null
        return allowedValues.contains(value) ? value : null;
    }

    @Override
    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public void setAllowedValues(String allowedValuesStr) {
        this.allowedValues = new HashSet<>(Arrays.asList(allowedValuesStr.split(",")));
    }

    @Override
    public void start() {}

    @Override
    public void stop() {}

    @Override
    public boolean isStarted() {
        return true;
    }
}
  1. 在logback配置中使用自定义鉴别器,移除默认值:
<appender name="TEST_LOGGER" class="ch.qos.logback.classic.sift.SiftingAppender">
  <discriminator class="com.yourpackage.CustomDiscriminator">
    <key>discKey</key>
    <allowedValues>targetKey1,targetKey2</allowedValues>
  </discriminator>
  <sift>
    <!-- 嵌套的RollingFileAppender配置 -->
    <appender name="FILE-${discKey}" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>logs/${discKey}/test.log</file>
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/${discKey}/test.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
        <maxHistory>30</maxHistory>
      </rollingPolicy>
      <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
    </appender>
  </sift>
</appender>

这样只有配置中allowedValues指定的鉴别键值才会生成对应的日志文件夹,其他情况都不会创建文件夹或记录日志。

补充说明

如果之前已经生成了Default文件夹,直接手动删除即可,后续按新配置运行不会再生成该目录。

内容的提问来源于stack exchange,提问作者MHSaffari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:01:17