如何配置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