如何移除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:自定义鉴别器,仅处理指定鉴别键
如果需要严格限定只生成特定鉴别键对应的文件夹,可自定义鉴别器来过滤非目标值:
- 实现
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; } }
- 在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
相关产品推荐
相关产品推荐

