Как не регистрировать конкретный тип исключения в Logback?
Как настроить Logback для игнорирования регистрации исключений определенного типа?
3 ответов
вы можете сделать это с простой EvaluatorFilter
:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>java.lang.RuntimeException.class.isInstance(throwable)</expression>
</evaluator>
<onMatch>DENY</onMatch>
</filter>
обратите внимание, что вам нужна следующая зависимость в вашем pom.xml
а также:
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.5.16</version>
</dependency>
другое возможное решение-custom Filter
реализация:
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class SampleFilter extends Filter<ILoggingEvent> {
private Class<?> exceptionClass;
public SampleFilter() {
}
@Override
public FilterReply decide(final ILoggingEvent event) {
final IThrowableProxy throwableProxy = event.getThrowableProxy();
if (throwableProxy == null) {
return FilterReply.NEUTRAL;
}
if (!(throwableProxy instanceof ThrowableProxy)) {
return FilterReply.NEUTRAL;
}
final ThrowableProxy throwableProxyImpl =
(ThrowableProxy) throwableProxy;
final Throwable throwable = throwableProxyImpl.getThrowable();
if (exceptionClass.isInstance(throwable)) {
return FilterReply.DENY;
}
return FilterReply.NEUTRAL;
}
public void setExceptionClassName(final String exceptionClassName) {
try {
exceptionClass = Class.forName(exceptionClassName);
} catch (final ClassNotFoundException e) {
throw new IllegalArgumentException("Class is unavailable: "
+ exceptionClassName, e);
}
}
}
С правильной конфигурацией:
<filter class="hu.palacsint.logbacktest.SampleFilter">
<exceptionClassName>java.lang.Exception</exceptionClassName>
</filter>
на TurboFilter
вы кинули Throwable
экземпляра напрямую, поэтому вы можете вызвать isInstance
метод без ручного литья IThrowableProxy
к ThrowableProxy
.
этому вопросу 5 лет, но я предоставляю решение, которое я нашел, чтобы держать его в курсе.
Я нашел решение в официальных документах: http://logback.qos.ch/manual/layouts.html
для моей конкретной ситуации, которая является 17-летним веб-сайтом с простыми старыми сервлетами (ах, дни), сервлет теперь создает исключение, если пользователь не вошел в систему. Вот мой код. фрагменты:
сервлет
try {
InvalidLoginException.throwIfBadLogin(webUser);
// main logic here
} catch (InvalidLoginException e) {
throw e;
} catch (Throwable t) {
log.error(t);
throw new UnhandledException(t);
}
web.в XML
<error-page>
<exception-type>com.mycompany.servlet.exception.InvalidLoginException</exception-type>
<location>/servlet/Login</location>
</error-page>
из настройки выше, я не хотел регистрировать это исключение, так как это не действительно исключение, а скорее перерыв в логике для перенаправления на вход в систему.
Итак, начало моего Logback так.в XML это:
<configuration packagingData="true" scan="true" debug="true" scanPeriod="30 seconds">
<evaluator name="InvalidLoginExceptionSuppressor">
<expression>throwable != null && throwable instanceof com.mycompany.servlet.exception.InvalidLoginException</expression>
</evaluator>
и дальше вниз в logback.xml-файл, мой appenders:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg %ex{full,InvalidLoginExceptionSuppressor}%n</pattern>
<immediateFlush>false</immediateFlush>
</encoder>
также обратите внимание, для того, чтобы эта работа, я должен был включить чжэньину обрабатывать выражения парсинг.
Это дополнительный пример ответа @palacsint что применяется, когда ошибка не является исключением, используя JaninoEventEvaluator:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>logger.equals("org.docx4j.fonts.GlyphCheck") && level == ERROR</expression>
</evaluator>
<onMatch>DENY</onMatch>
</filter>