1.spring.xml(这里主要配置了抛出异常后的操作after-throwing)
需要注意的地方以黄色标注,主要是几个切入点bean配置
<!-- 激活自动代理功能 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 系统服务组件的切面Bean --> <bean id="aspectService" class="com.test.http.utils.AspectService"></bean> <!-- AOP配置 --> <aop:config> <!-- 声明一个切面,并注入切面Bean,相当于@Aspect --> <aop:aspect id="simpleAspect" ref="aspectService"> <!-- 配置一个切入点,相当于@Pointcut --> <aop:pointcut expression="execution(* com.test.http.ser..*(..))" id="simplePointcut"/> <aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/> </aop:aspect> </aop:config>
2.AspectService.java(此类为切面的具体实现类)
package com.test.http.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.JoinPoint; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; public class AspectService { private final static Log log = LogFactory.getLog(AspectService.class); //配置抛出异常后通知,使用在方法aspect()上注册的切入点 public void afterThrow(JoinPoint joinPoint, Exception ex){ System.out.println("进入切面AfterThrowing方法中..."); //判断日志输出级别 if(log.isInfoEnabled()){ log.info("afterThrow " + joinPoint + " " + ex.getMessage()); } //详细错误信息 String errorMsg = ""; StackTraceElement[] trace = ex.getStackTrace(); for (StackTraceElement s : trace) { errorMsg += " at " + s + " "; } System.out.println("具体异常信息:"+errorMsg); System.out.println("afterThrow异常方法名 " + joinPoint + " " + ex.getMessage()); System.out.println("进入切面AfterThrowing方法结束!!!"); //写入异常日志 writeLog(errorMsg,joinPoint,ex); } /** * * @param detailErrMsg 详细错误信息 * @param method 方法名称 * @Description: 日志异常 * @author: Ma * @createTime: 2016-10-14 */ public void writeLog(String detailErrMsg,JoinPoint joinPoint,Exception ex){ HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder. getRequestAttributes()).getRequest(); //获取请求的URL StringBuffer requestURL = request.getRequestURL(); //获取参 数信息 String queryString = request.getQueryString(); //封装完整请求URL带参数 if(queryString != null){ requestURL .append("?").append(queryString); } String cla=joinPoint.getTarget().getClass().getName();//action String method=joinPoint.getSignature().getName();//method try{ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //创建输出异常log日志 File file =new File("d:/test/"+System.currentTimeMillis()+method+".log"); //if file doesnt exists, then create it if(!file.exists()){ file.createNewFile(); } FileOutputStream out=new FileOutputStream(file,false); //如果追加方式用true //日志具体参数 StringBuffer sb=new StringBuffer(); sb.append("-----------"+sdf.format(new Date())+"------------ "); sb.append("远程请求URL["+requestURL+"] "); sb.append("接口方法:["+cla+"."+method+"] "); sb.append("详细错误信息:"+ex+" "); sb.append(detailErrMsg+" "); out.write(sb.toString().getBytes("utf-8"));//注意需要转换对应的字符集 out.close(); System.out.println("Done"); }catch(IOException e){ e.printStackTrace(); } } }
3.创建测试类
public void testMethod(HttpServletRequest request){ System.out.println("进入方法"); //System.out.println(request.getParameter("username")); int i = 9 / 0; }
4.运行后log日志情况
-----------2016-10-19 14:09:48------------ 远程请求URL[http://localhost:8080/httpser/api/testAspect.action?p=111&s=222] 具体方法:[com.xx.ad.http.ser.MovCallBackSer.testMethod] 详细错误信息:java.lang.ArithmeticException: / by zero at com.xx.ad.http.ser.MovCallBackSer.testMethod(MovCallBackSer.java:171) at com.xx.ad.http.ser.MovCallBackSer$$FastClassBySpringCGLIB$$9be1671c.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) at com.xx.ad.http.ser.MovCallBackSer$$EnhancerBySpringCGLIB$$b6f0914c.testMethod(<generated>) at com.xx.ad.http.controller.ControllerMovCallBack.testAspect(ControllerMovCallBack.java:71) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:724)
其它切面皆可同等配置如图: