spring aop log日志

转自: http://ysj5125094.iteye.com/blog/2151855

利用spring AOP实现每个请求的日志输出



前提条件:

除了spring相关jar包外,还需要引入aspectj包。

Xml代码   收藏代码
  1. <dependency>  
  2.         <groupId>org.aspectj</groupId>  
  3.         <artifactId>aspectjweaver</artifactId>  
  4.         <version>1.7.2</version>  
  5.     </dependency>  

 

 

 

要实现此功能,必须完成以下几步:

1.在springmvc-servlet.xml中实现对AOP的支持

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.     xmlns:aop="http://www.springframework.org/schema/aop"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xsi:schemaLocation="     
  8.            http://www.springframework.org/schema/beans     
  9.            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd     
  10.            http://www.springframework.org/schema/context     
  11.            http://www.springframework.org/schema/context/spring-context-4.0.xsd    
  12.            http://www.springframework.org/schema/mvc     
  13.            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  14.            http://www.springframework.org/schema/aop   
  15.            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">  
  16.              
  17.     <aop:aspectj-autoproxy proxy-target-class="true"/>  
  18.     <bean class="com.yusj.interceptor.LogAspect" />  
  19. .  
  20. .  
  21. .  
  22. .  
  23. </beans>  

 

2.注解的方法实现Aspect

Java代码   收藏代码
  1. package com.yusj.core.interceptor;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.http.HttpServletRequest;  
  8.   
  9. import org.aspectj.lang.JoinPoint;  
  10. import org.aspectj.lang.ProceedingJoinPoint;  
  11. import org.aspectj.lang.annotation.After;  
  12. import org.aspectj.lang.annotation.Around;  
  13. import org.aspectj.lang.annotation.Aspect;  
  14. import org.aspectj.lang.annotation.Before;  
  15. import org.slf4j.Logger;  
  16. import org.slf4j.LoggerFactory;  
  17. import org.springframework.web.context.request.RequestAttributes;  
  18. import org.springframework.web.context.request.RequestContextHolder;  
  19. import org.springframework.web.context.request.ServletRequestAttributes;  
  20.   
  21. import com.google.gson.Gson;  
  22.   
  23. /** 
  24.  *  
  25. * @ClassName: LogAspect  
  26. * @Description: 日志记录AOP实现  
  27. * @author shaojian.yu 
  28. * @date 2014年11月3日 下午1:51:59  
  29. * 
  30.  */  
  31. @Aspect  
  32. public class LogAspect {  
  33.     private final Logger logger = LoggerFactory.getLogger(this.getClass());  
  34.   
  35.     private String requestPath = null ; // 请求地址  
  36.     private String userName = null ; // 用户名  
  37.     private Map<?,?> inputParamMap = null ; // 传入参数  
  38.     private Map<String, Object> outputParamMap = null// 存放输出结果  
  39.     private long startTimeMillis = 0// 开始时间  
  40.     private long endTimeMillis = 0// 结束时间  
  41.   
  42.     /** 
  43.      *  
  44.      * @Title:doBeforeInServiceLayer 
  45.      * @Description: 方法调用前触发  
  46.      *  记录开始时间  
  47.      * @author shaojian.yu  
  48.      * @date 2014年11月2日 下午4:45:53 
  49.      * @param joinPoint 
  50.      */  
  51.     @Before("execution(* com.yusj.controller..*.*(..))")  
  52.     public void doBeforeInServiceLayer(JoinPoint joinPoint) {  
  53.         startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间  
  54.     }  
  55.   
  56.     /** 
  57.      *  
  58.      * @Title:doAfterInServiceLayer 
  59.      * @Description: 方法调用后触发  
  60.      *  记录结束时间 
  61.      * @author shaojian.yu  
  62.      * @date 2014年11月2日 下午4:46:21 
  63.      * @param joinPoint 
  64.      */  
  65.     @After("execution(* com.yusj.controller..*.*(..))")  
  66.     public void doAfterInServiceLayer(JoinPoint joinPoint) {  
  67.         endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间  
  68.         this.printOptLog();  
  69.     }  
  70.   
  71.     /** 
  72.      *  
  73.      * @Title:doAround 
  74.      * @Description: 环绕触发  
  75.      * @author shaojian.yu  
  76.      * @date 2014年11月3日 下午1:58:45 
  77.      * @param pjp 
  78.      * @return 
  79.      * @throws Throwable 
  80.      */  
  81.     @Around("execution(* com.yusj.controller..*.*(..))")  
  82.     public Object doAround(ProceedingJoinPoint pjp) throws Throwable {  
  83.         /** 
  84.          * 1.获取request信息 
  85.          * 2.根据request获取session 
  86.          * 3.从session中取出登录用户信息 
  87.          */  
  88.         RequestAttributes ra = RequestContextHolder.getRequestAttributes();  
  89.         ServletRequestAttributes sra = (ServletRequestAttributes)ra;  
  90.         HttpServletRequest request = sra.getRequest();  
  91.         // 从session中获取用户信息  
  92.         String loginInfo = (String) session.getAttribute("username");  
  93.         if(loginInfo != null && !"".equals(loginInfo)){  
  94.             userName = operLoginModel.getLogin_Name();  
  95.         }else{  
  96.             userName = "用户未登录" ;  
  97.         }  
  98.         // 获取输入参数  
  99.         inputParamMap = request.getParameterMap();  
  100.         // 获取请求地址  
  101.         requestPath = request.getRequestURI();  
  102.           
  103.         // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行  
  104.         outputParamMap = new HashMap<String, Object>();  
  105.         Object result = pjp.proceed();// result的值就是被拦截方法的返回值  
  106.         outputParamMap.put("result", result);  
  107.           
  108.         return result;  
  109.     }  
  110.   
  111.     /** 
  112.      *  
  113.      * @Title:printOptLog 
  114.      * @Description: 输出日志  
  115.      * @author shaojian.yu  
  116.      * @date 2014年11月2日 下午4:47:09 
  117.      */  
  118.     private void printOptLog() {  
  119.         Gson gson = new Gson(); // 需要用到google的gson解析包  
  120.         String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);  
  121.         logger.info("\n user:"+userName  
  122.                 +"  url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;"  
  123.                 +" param:"+gson.toJson(inputParamMap)+";"+"\n result:"+gson.toJson(outputParamMap));  
  124.     }  
  125. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值