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

Exception 如何在Logback中不记录特定类型的异常?,exception,logging,configuration,logback,Exception,Logging,Configuration,Logback,如何将Logback配置为忽略特定类型异常的日志记录?您可以使用一个简单的EvaluatorFilter: <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>java.lang.RuntimeException.class.isInstance(throwable)</expression> <

如何将Logback配置为忽略特定类型异常的日志记录?

您可以使用一个简单的
EvaluatorFilter

<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator>
        <expression>java.lang.RuntimeException.class.isInstance(throwable)</expression>
    </evaluator>
    <onMatch>DENY</onMatch>
</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);
        }
    }
}
导入ch.qos.logback.classic.spi.ILoggingEvent;
导入ch.qos.logback.classic.spi.IThrowableProxy;
导入ch.qos.logback.classic.spi.ThrowableProxy;
导入ch.qos.logback.core.filter.filter;
导入ch.qos.logback.core.spi.FilterReply;
公共类SampleFilter扩展了过滤器{
私有类例外类;
公共样本过滤器(){
}
@凌驾
公共筛选器独立决定(最终ILOGINGEVENT事件){
final IThrowableProxy throwableProxy=event.getThrowableProxy();
if(throwableProxy==null){
返回FilterReply.NEUTRAL;
}
如果(!(throwableProxy的throwableProxy实例)){
返回FilterReply.NEUTRAL;
}
最终ThrowableProxy throwableProxyImpl=
(一次性代理)一次性代理;
final Throwable Throwable=throwableProxyImpl.getThrowable();
if(异常类isInstance(可丢弃)){
返回FilterReply.DENY;
}
返回FilterReply.NEUTRAL;
}
public void setExceptionClassName(最终字符串exceptionClassName){
试一试{
exceptionClass=Class.forName(exceptionClassName);
}捕获(最终类NotFound异常e){
抛出新的IllegalArgumentException(“类不可用:”
+例外类别名称,e);
}
}
}
使用适当的配置:

<filter class="hu.palacsint.logbacktest.SampleFilter">
    <exceptionClassName>java.lang.Exception</exceptionClassName>
</filter>

java.lang.Exception
TurboFilter
中,您可以调用该方法,而无需手动将
IThrowableProxy
强制转换为
ThrowableProxy


这个问题已经有5年历史了,但我提供的解决方案只是为了让它保持最新

我在官方文档中找到了一个解决方案:

对于我的特殊情况,这是一个17年的web站点,运行普通的旧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>

com.mycompany.servlet.exception.InvalidLoginException
/servlet/登录
从上面的设置中,我不想记录这个异常,因为它不是一个真正的异常,而是一个重定向到登录的逻辑中断

因此,我的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>

可扔掉的!=空&空&;com.mycompany.servlet.exception.InvalidLoginException的可丢弃实例
在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>

处理表达式解析。

这是当错误不是异常时应用的响应的另一个示例,使用:


logger.equals(“org.docx4j.fonts.GlyphCheck”)&&;级别==错误
否认

谢谢,我已经解决了这个问题,但这是未来的好信息。如果您忽略了某个记录器,您可以禁用该记录器
  <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>