Различные типы приложений для Logback Sifting Appender
Я настроил 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
как правило, не очень большие, но глобальные.
Это возможно?
3 ответа
Я думаю, что лучше всего в этой ситуации расширить SiftingAppender и переопределить добавление и выбросить все, что не имеет ключа (вместо использования по умолчанию).
Самый быстрый способ, который я могу придумать, - это создать два дополнения и отправить события обоим. Затем настройте 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);
}
}
}
Я думаю, что вы можете сделать это с отличной конфигурацией, если это вариант для вас. Вы можете написать оператор if на основе дискриминатора
appender("SIFT", GSiftingAppender) {
discriminator(MDCBasedDiscriminator) {
key = "context"
defaultValue = "global"
}
sift {
if(..) {
appender(....) {
}
}
}
}
Вы можете использовать фильтр на appenders. Фильтр на вашем приложении будет включать, а фильтр на других приложениях будет исключать