在項目開發中往往需要記錄一些用戶操作的系統日志到數據庫,而不僅僅是記錄在文件中或者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攔截具體的注解而達到按需記錄日志的功能。