zoukankan      html  css  js  c++  java
  • spring aop 配置切面,记录系统异常存入log日志

    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)

    其它切面皆可同等配置如图:

  • 相关阅读:
    SANBA服务和FTP服务
    rpm和yum软件管理
    Linux进程管理
    Linux网络技术管理
    RAID磁盘阵列及CentOS7启动流程
    Linux磁盘管理及Lvm
    Linux计划任务及压缩归档
    Linux权限管理
    Linux用户及用户组管理
    vim 编辑器
  • 原文地址:https://www.cnblogs.com/maz9666/p/5977424.html
Copyright © 2011-2022 走看看