2014-06-22 90 views
1

如何從登錄的aspectj中排除特定異常?從日誌中排除例外

我們使用spring安全性,所以我們實現了UserDetailsS​​ervice。 當用戶輸入不存在的用戶名時,彈出org.springframework.security.core.userdetails.UsernameNotFoundException。我們想從日誌中排除該特定的異常,但不是它從中拋出的類(UserDetailsS​​ervice的實現)。例如在下面的日誌中,我們只需要第一行(輸入... UserDetailsS​​erviceImpl),而不是後面的錯誤。

22 Jun 2014 14:20:35 INFO LoggingAspect - Entering: ...UserDetailsServiceImpl Method name: loadUserByUsername Method arguments : [***] 
22 Jun 2014 14:20:42 ERROR LoggingAspect - Unhandled exception caught: ...service.UserDetailsServiceImpl loadUserByUsername 
org.springframework.security.core.userdetails.UsernameNotFoundException: User with loginName: *** doesnt exist 
at ...UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:30) 
... 

有沒有辦法做到這一點春季AOP?

編輯: 這是我們在LoggingAspect:

@AfterThrowing(pointcut = "execution(* ..*.*(..)) && !methodsExcludedFromLog()", throwing = "exp") 
public void afterThrowing(JoinPoint joinPoint, Throwable exp) { 
... 
} 

我這個,我需要以某種方式改變throwing排除春季例外,但我不知道該怎麼做。

編輯2: 所以正如在評論中所建議的,我嘗試在log4j中添加一個過濾器,但它似乎不工作,並且異常不會被過濾掉。任何人都知道問題可能是什麼?

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n" /> 
    </layout> 
</appender> 

<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> 
    <param name="append" value="false" /> 
    <param name="file" value="${catalina.home}/logs/MYAPP.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" /> 
    </layout> 
    <filter class="org.apache.log4j.filter.ExpressionFilter"> 
     <param name="expression" value="EXCEPTION ~= org.springframework.security.core.userdetails.UsernameNotFoundException" /> 
     <param name="acceptOnMatch" value="false"/> 
    </filter> 

</appender> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="consoleAppender" /> 
    <appender-ref ref="fileAppender" /> 
</root> 

謝謝。

+0

你能分享你的源代碼和配置並解釋你的請求嗎? –

+0

看我的編輯。現在更清楚了嗎? – Ayelet

+2

爲什麼要使用AOP?如果您有像Logback這樣的良好日誌記錄軟件包,則可以實施過濾器來排除不需要的消息。 http://logback.qos.ch/manual/filters.html – Bart

回答

0

正如在評論中討論,你只能使用

{ 
    if (e instanceof UsernameNotFoundException) 
     return; 
    // Log exception 
} 

在你的建議的開始。在AspectJ或Spring AOP中沒有語法方式以某種方式在「投擲」部分中使用jokers或布爾表達式。在那裏,您只能選擇捕獲所有異常,或通過將拋出的異常綁定到類型變量來隱式縮小選擇範圍到一個特定類型(及其子類型)。如果你考慮一下,你應該如何將一個對象綁定到一個具有多種類型的變量?

無論你喜不喜歡,這是正確的答案。我現在無法爲您更改AspectJ語法和語義。 :-)