Exception 如何在Logback中不记录特定类型的异常?
如何将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> <
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 && 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>