首先我們為什么需要做日志管理,在現實的上線中我們經常會遇到系統出現異常或者問題。這個時候就馬上打開CRT或者SSH連上服務器拿日子來分析。受網絡的各種限制。于是我們就想為什么不能直接在管理后臺查看報錯的信息呢。于是日志管理就出現了。
其次個人覺得做日志管理最好的是Aop,有的人也喜歡用攔截器。都可以,在此我重點介紹我的實現方式。
Aop有的人說攔截不到Controller。有的人說想攔AnnotationMethodHandlerAdapter截到Controller必 須得攔截 org.sPRingframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。
首先Aop可以攔截到Controller的,這個是毋容置疑的其次須攔截AnnotationMethodHandlerAdapter也不是必須的。最起碼我沒有驗證成功過這個。我的Spring版本是4.0.3。
Aop之所以有的人說攔截不到Controller是因為Controller被jdk代理了。我們只要把它交給cglib代理就可以了。
第一步定義兩個注解:
- package com.annotation;
-
- import java.lang.annotation.*;
-
-
- @Target({ElementType.PARAMETER, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface SystemControllerLog {
-
- String description() default "";
-
-
- }
-
- package com.annotation;
-
- import java.lang.annotation.*;
-
-
- @Target({ElementType.PARAMETER, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface SystemServiceLog {
-
- String description() default "";
-
-
- }
第二步創建一個切點類:
第三步把Controller的代理權交給cglib
在實例化applicationContext的時候需要加上
- <!-- 啟動對@AspectJ注解的支持 -->
- <aop:aspectj-autoproxy/>
在調用Controller的時候AOP發揮作用所以在SpringMVC的配置文件里加上
Xml代碼
- <!--通知spring使用cglib而不是jdk的來生成代理方法 AOP可以攔截到Controller->
- <aop:aspectj-autoproxy proxy-target-class="true" />
第四步使用
Controller層的使用
Java代碼
- @RequestMapping(value = "/delete")
-
- @SystemControllerLog(description = "刪除用戶")
- public String del(Criteria criteria, String id, Model model, HttpSession session) {
- try {
- User user = (User) session.getAttribute(WebConstants.CURRENT_USER);
- if ( null != user) {
- if (user.getId().equals(id)) {
- msg = "您不可以刪除自己!";
- criteria = userService.selectByCriteriaPagination(criteria);
- } else {
-
- criteria = userService.delete(id, criteria);
- msg = "刪除成功!";
- }
- }
- } catch (Exception e) {
- msg = "刪除失敗!";
- } finally {
- model.addAttribute("msg", msg);
- model.addAttribute("criteria", criteria);
- }
-
- return "user/list";
- }
Service層的使用
- /**
- * 按照分頁查詢
- * @param criteria
- * @return
- */
- //此處為AOP攔截Service記錄異常信息。方法不需要加try-catch
- @SystemServiceLog(description = "查詢用戶")
- public Criteria<User> selectByCriteriaPagination(Criteria<User> criteria)
- {
- criteria.getList().get(0).getAccount();
- //查詢總數
- long total=userMapper.countByCriteria(criteria);
- //設置總數
- criteria.setRowCount(total);
- criteria.setList(userMapper.selectByCriteriaPagination(criteria));
- return criteria;
- }
效果圖
用戶操作:
![]()
異常
