2012-03-20 127 views
4

我正在與春天3.0.6。我的應用程序有很多地方添加日誌記錄(slf4j)。假設我需要在每個嚴重錯誤上添加一些函數 - 對我來說,每次調用錯誤級別日誌記錄會更好,並且可能會在發送後支持異常消息或者像這樣的消息 - 而不是手動將代碼添加到應用程序中的所有位置。春天aspectj切入點與slf4j

我已經創建了以下類:

@Aspect 
public class LoggingWrapper { 

    @Pointcut("execution (* org.slf4j.Logger.error(..))") 
    public void logError() { 
    } 

    @AfterReturning("logError()") 
    public void afterError() { 
     //System.out.println("LOGERROR ASPECT AFTER"); 
     //send email... 
    } 
} 

在Spring配置:

<aop:aspectj-autoproxy /> 
<bean id="loggingWrapper" class="com.app.services.LoggingWrapper"/> 

方面是我的班運作良好,但對於org.slf4j.Logger - 什麼都沒有發生

回答

6

@ crudo6,這將不支持使用代理的Spring @AspectJ支持 - 原因在於Spring處理@AspectJ註釋的方式是創建代理,例如。如果您的@Around對於您的@PointCut("execution (for your class)")的建議,那麼Spring將創建代表所有豆類的Spring Context的代理,其類型與切入點中的類匹配。

由於slf4j類不是Spring上下文的一部分,因此不會爲它們創建代理,並且您的方面不會生效。要使它們工作,可以嘗試加載時間編織或編譯時間編織並使用'@Pointcut(「call(* org.slf4j.Logger.error(..))」)''而不是執行,這樣任何對SLF4J的調用都可以被你的建議攔截。執行的@Pointcut需要編譯可能不可能的slf4j庫。

+0

+1工作得非常好。 – Ritesh 2014-05-21 20:49:25

0

在錯誤情況下同步發送郵件是一種不好的做法。您最終可能發送過多的電子郵件,這些電子郵件可能會佔用較長時間的線程,並影響應用程序的性能,因此可擴展性不佳。最好的方法是使用Splunk等日誌監視工具。

+0

發送郵件就是例子。問題是關於如何捕捉方面的日誌方法調用 – crudo6 2012-03-20 10:53:07

+0

我的觀點是,它是一個錯誤的問題來解決。應該不需要截取日誌方法。它不覺得這是正確的事情。 – 2012-03-20 14:04:17