spring aop环绕通知记录应用的日志

使用的框架是spring mvc+spring

最近想利用spring aop的环绕通知来处理web的日志问题,总的来讲,如果在controller层做切入,则难监控实际运行情况,在service层做切入,则只能监控到service层的情况,通过捕捉service抛出的异常来记录日志,对于目前本人应用而言,已经足够了,先将记录如下:

代码:

@Component
@Aspect
public class ExceptionLog {

    /**
     * 61      * 环绕通知需要携带ProceedingJoinPoint类型的参数
     * 62      * 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
     * 63      * 而且环绕通知必须有返回值,返回值即为目标方法的返回值
     * 64
     */
    @Around("execution(* *com.test.service..*.*(..))")
    public Object aroundMethod(ProceedingJoinPoint pjd) throws Throwable {
        Object result = null;
        String methodName = "class:" + pjd.getTarget().getClass().getName() + " method:" + pjd.getSignature().getName(); //获取方法名称

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //获取请求的URL//执行目标方法
        try {
            //前置通知
            result = pjd.proceed();//返回通知
        } catch (Throwable e) {
            //异常通知
//            System.out.println("The method " + methodName + " occurs expection : " + e);throw e;  /让spring处理异常
        }finally {
           //记录日志


        }
        return result;  //必须返回结果,否则controller无法获取service返回的结果(正常情况下)
    }
}

spring 配置:

 <aop:aspectj-autoproxy/>

web.xml配置(主要是用于获取方便程序获取HttpServletRequest)

 <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

 

posted @ 2015-06-19 22:05  世间安得两全法  阅读(746)  评论(0)    收藏  举报