我已经像这样配置了一个SiftingAppender:
<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>
现在,我希望其中有RollingFileAppender
,但仅适用于没有context
的邮件。那些context
的人通常不是很大,但全球的人是。
这可能吗?
答案 0 :(得分:4)
我认为在这种情况下最好的事情是扩展SiftingAppender并覆盖append并抛弃任何没有密钥的东西(而不是使用默认值)。
我能想到的最快的方法是创建两个appender并将事件发送给两者。然后配置SiftingWhileRejectingDefaultAppender以使用RollingFileAppender并配置SiftingRejectAllButDefaultAppender以使用常规FileAppender。
<强> SiftingWhileRejectingDefaultAppender 强>
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);
}
}
}
<强> SiftingRejectAllButDefaultAppender 强>
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);
}
}
}
答案 1 :(得分:3)
我认为你可以使用groovy配置,如果它是一个选项。您可以根据鉴别器
编写if语句appender("SIFT", GSiftingAppender) {
discriminator(MDCBasedDiscriminator) {
key = "context"
defaultValue = "global"
}
sift {
if(..) {
appender(....) {
}
}
}
}
答案 2 :(得分:0)
您可以在appender上使用过滤器。您的appender上的过滤器将包含,其他appender上的过滤器将被排除