Как мне не регистрировать особый тип исключения в Logback? - PullRequest
11 голосов
/ 26 мая 2011

Как настроить Logback таким образом, чтобы игнорировать регистрацию исключений определенного типа?

Ответы [ 3 ]

22 голосов
/ 10 сентября 2011

Вы можете сделать это с помощью простого 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>

Другим возможным решением является пользовательская 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 .

Дополнительная документация

1 голос
/ 09 августа 2016

Этому вопросу уже 5 лет, но я предоставляю решение, которое нашел, чтобы просто обновлять его.

Я нашел решение в официальных документах: http://logback.qos.ch/manual/layouts.html

Для моей конкретной ситуации, когда 17-летний веб-сайт работает с простыми старыми сервлетами (ах, дни), сервлет теперь выдает исключение, если пользователь не вошел в систему. Итак, вот мои фрагменты кода:

Servlet

  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 &amp;&amp; throwable instanceof com.mycompany.servlet.exception.InvalidLoginException</expression>
    </evaluator>

и далее в файле logback.xml мои добавители:

  <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>

Также обратите внимание, что для этой работы мне пришлось включить janino для обработки разбора выражения.

0 голосов
/ 30 мая 2018

Это дополнительный пример ответа @ palacsint , который применяется, когда ошибка не является исключением, используя JaninoEventEvaluator :

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator>
    <expression>logger.equals("org.docx4j.fonts.GlyphCheck") &amp;&amp; level == ERROR</expression>
  </evaluator>
  <onMatch>DENY</onMatch>
</filter>
...