使用的框架是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>