如何不在Logback中记录特定类型的Exception?

| 如何配置Logback忽略登录特定类型的异常?     
已邀请:
您可以使用简单的
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>
另一个可能的解决方案是自定义“ 4”实现:
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>
在ѭ7中,您直接获得了抛出的
Throwable
实例,因此您可以调用ѭ9without方法,而无需手动将
IThrowableProxy
强制转换为
ThrowableProxy
。 进一步的文件     
这个问题已有5年历史了,但是我提供的解决方案只是为了使其保持最新状态。 我在官方文档中找到了解决方案: http://logback.qos.ch/manual/layouts.html 对于我的特殊情况,这是一个17岁的网站,运行的是普通的旧servlet(啊,日子),如果用户未登录,则servlet现在抛出异常。因此,这是我的代码段: 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来处理表达式解析。     
这是@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>
    

要回复问题请先登录注册