在項目開發中往往需要記錄一些使用者操作的系統日志到資料庫,而不僅僅是記錄在檔案中或者log4j上。
第一種是最簡單最原始也是最繁瑣最笨的辦法:即每個需要記錄的操作入口方法中去調用新增日志的接口。
第二種是采用spring的攔截器進行方法攔截:
建立一個攔截器:
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.dw..interceptor.LogInterceptor"></bean>
</mvc:interceptor>
建立一個攔截器的class繼承spring web的HandlerInterceptorAdapter類,在spring4中該類有四個方法可以進行重寫,如:
preHandle:它會在處理方法之前執行,可以用來做一些編碼處理、安全限制之類的操作。
postHandle:它是在方法執行後開始傳回前執行,可以進行日志記錄、修改ModelView之類的操作。
afterCompletion:最後執行,無論出錯與否都會執行這個方法,可以用來記錄異常資訊和一些必要的操作記錄。
afterConcurrentHandlingStarted:controller方法異步開始執行時就開始執行這個方法,而postHandle需要等到controller異步執行完成後再執行。
需要注意的是spring的攔截器無法擷取處理函數的參數值。
第三種就是采用spring的AOP配置注解進行攔截:
首先在springAOP中的三個概念:advice、pointcut、advisor。
建立一個類,無需任何繼承和實作接口,隻需要在類上加入注解@Aspect。建立一個切入點的方法,注解@Pointcut,然後在建立一個方法,配置需
要通知的類型,通過JoinPoint相關類來擷取參數值和請求的内容。具體的切入點和通知類型的表達式需參考springAOP相關的表達式文法。然後
需要在配置檔案配置<aop:aspectj-autoproxy>,即aspectj動态代理。
具體的日志記錄實作、可以采用比對請求位址的方法進行記錄(因為查詢操作可能不需要記錄),哪些需要記錄的請求可以通過配置檔案來配置,也可以通過注解來實作。
或者是通過自定義注解來實作日志攔截,通過Pointcut攔截具體的注解而達到按需記錄日志的功能。
作者:少帥