使用的框架是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>
时间: 2024-10-17 12:20:34