通过spring aop管理日志

在项目中我们可以同spring 的aop来统一处理日志,避免了很多重复代码,配置如下:

spring 中配置:

 <!-- 激活自动代理功能 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!-- 系统服务组件的切面Bean -->
    <bean id="aspectService" class="com.gm.yanshang.yanshang_project.common.AspectService"></bean>
    <!-- AOP配置 -->
    <aop:config>
        <!-- 声明一个切面,并注入切面Bean,相当于@Aspect -->
        <aop:aspect id="simpleAspect" ref="aspectService">
            <!-- 配置一个切入点,相当于@Pointcut -->
            <aop:pointcut expression="execution(* com.gm.yanshang.yanshang_project..*(..))" id="simplePointcut"/>
            <aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
        </aop:aspect>
    </aop:config>


下面是log增强类的处理:

import java.text.SimpleDateFormat;
import java.util.Date;


import javax.servlet.http.HttpServletRequest;


import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


public class AspectService implements ThrowsAdvice
{
Logger logger=Logger.getLogger(AspectService.class);
//配置抛出异常后通知,使用在方法aspect()上注册的切入点
    public void afterThrow(JoinPoint joinPoint, Exception ex){


        logger.info("进入切面AfterThrowing方法中...");
        //判断日志输出级别
        if(logger.isInfoEnabled()){
        logger.info("afterThrow " + joinPoint + "\t" + ex.getMessage());
        }
        //详细错误信息
        String errorMsg = "";
        StackTraceElement[] trace = ex.getStackTrace();
        for (StackTraceElement s : trace) {
            errorMsg += "\tat " + s + "\r\n";
        }
        //写入异常日志
        writeLog(errorMsg,joinPoint,ex);


    }


    /**
     *
     * @param detailErrMsg 详细错误信息
     * @param method 方法名称
     * @Description: 日志异常
     */
    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

            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //日志具体参数
            StringBuffer sb=new StringBuffer();
            sb.append("-----------"+sdf.format(new Date())+"------------\r\n");
            sb.append("远程请求URL["+requestURL+"]\r\n");
            sb.append("接口方法:["+cla+"."+method+"]\r\n");
            sb.append("详细错误信息:"+ex+"\r\n");
            sb.append(detailErrMsg+"\r\n");
            logger.info(sb);

    }

}

这样所有异常日志都会被拦截到log中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值