如何配置Logback忽略特定类型的异常日志记录?如何在Logback中不记录特定类型的异常?
7
A
回答
15
你可以用一个简单的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);
}
}
}
Wi TH适当配置:
<filter class="hu.palacsint.logbacktest.SampleFilter">
<exceptionClassName>java.lang.Exception</exceptionClassName>
</filter>
在TurboFilter
you get the thrown Throwable
instance directly,这样你就可以调用isInstance
方法,无需手工铸造IThrowableProxy
到ThrowableProxy
。
1
这个问题是5岁,但我提供我发现只是为了保持其最新的解决方案。
我发现在官方文档的解决方案: http://logback.qos.ch/manual/layouts.html
对于我的特定情况下,它是运行普通的旧的Servlet一个17岁的网站(啊,天),该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 && throwable instanceof com.mycompany.servlet.exception.InvalidLoginException</expression>
</evaluator>
,并在logback.xml文件进一步下跌,我的appender:
<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来处理表达式解析。
相关问题
- 1. 如何在logback中过滤特定类型的异常
- 2. 如何从tomcat中部署的特定包中记录异常
- 3. akka.actor.ActorLogging不会记录异常的堆栈跟踪logback
- 4. 自定义异常类型是'自我记录' - 是不是?
- 5. 处理特定的异常类型
- 6. 忽略特定类型的异常
- 7. 如何在文件中记录异常?
- 8. 如何在appengine中记录异常?
- 9. 如何在AppHarbor中记录unhandeled异常?
- 10. Tomcat异常类型忽略更一般的特定异常
- 11. WCF:如何记录异常?
- 12. 如何记录python异常?
- 13. 如何记录“catched”异常?
- 14. 如何记录sql异常?
- 15. 在asp.net中记录异常
- 16. 异常类应该如何特定?
- 17. 在python中处理特定的异常类型
- 18. 只在RxJava中捕获特定类型的异常2
- 19. 如何使用Netsuite API获取特定记录类型的记录总数?
- 20. 如何异步记录SqlDataAdapter异常?
- 21. 如何记录异常在JavaScript
- 22. 如何在Eclipse中忽略特定类型的未捕获异常?
- 23. 异常记录
- 24. 异常记录
- 25. 如何确定是否异常是一种特殊类型
- 26. 在python中自定义异常。如何记录错误?
- 27. Log4net不记录异常
- 28. Elmah不记录NullReference异常
- 29. 哨兵 - 如何仅记录异常,而不是记录器
- 30. 我可以防止logback的DBAppender记录特定的属性吗?
谢谢,我自那时起就围绕这个特定问题开展工作,但这对未来来说是很好的信息。 – 2011-09-12 15:41:28