Spring 切面 记录请求日志

来源:互联网 发布:超星尔雅网络课程答案 编辑:程序博客网 时间:2024/05/16 04:52

1、创建标签

import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(value = ElementType.METHOD)@Retention(value = RetentionPolicy.RUNTIME)@Documentedpublic @interface Log {    String action() default "";    String description() default "";}

2、创建切面

import java.lang.reflect.Method;import java.util.Date;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.Signature;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import com.freemarker.util.DateUtils;/** * spring切面 请求日志 *  * @author 96315 *  */@Aspect@Componentpublic class RequestLogger {    private static Logger logger = Logger.getLogger(RequestLogger.class);    @Pointcut("execution(* com..*Controller.*(..))")    public void controllerAspect() {    };    /**     * 请求记录     * @param point     */    @AfterReturning(pointcut = "controllerAspect()", returning = "r")    public void log(final JoinPoint point) {        handleLog(point,null);    }    /**     * 日志--异常处理     */    @AfterThrowing(pointcut = "controllerAspect()", throwing = "e")    public void afterThrowing(JoinPoint joinPoint, Exception e) {        handleLog(joinPoint,e);    }    /**     * 日志处理,存入数据库     */    private void handleLog(JoinPoint joinPoint, Exception e) {        try {            //获取注解标签            Log log = getLog(joinPoint);            if (log == null) {//无注解标签                return;            }            if (logger.isDebugEnabled()) {                StringBuffer sb = new StringBuffer();                sb.append("\n");                sb.append("时间:");                sb.append(DateUtils.format(new Date(System.currentTimeMillis()),DateUtils.YYYY_MM_DD_HH_MM_SS));                sb.append("\n");                sb.append("请求:");                sb.append(log.action());                sb.append("\n");                // sb.append("用户:");                // sb.append(AuthcUtils.getAuth().getUsername());                // sb.append("\n");                sb.append("方法:");                sb.append(joinPoint.getSignature());                sb.append("\n");                sb.append("描述:");                sb.append(log.description());                sb.append("\n");                if (e != null) {                    sb.append("异常:");                    sb.append(e.getMessage());                    sb.append("\n");                    logger.error(sb.toString());                }else{                    logger.info(sb.toString());                }            }        } catch (Exception ex) {            ex.printStackTrace();            logger.error("日志记录异常:\n"+ex.getMessage());        }    }    /**     * 是否存在注解,如果存在就记录日志     * @param joinPoint     * @return     * @throws Exception     */    private static Log getLog(JoinPoint joinPoint) throws Exception {        Signature signature = joinPoint.getSignature();        MethodSignature methodSignature = (MethodSignature) signature;        Method method = methodSignature.getMethod();        if (method != null) {            return method.getAnnotation(Log.class);        }        return null;    }}

3、Spring配置

<!-- 声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面 -->    <aop:aspectj-autoproxy proxy-target-class="true" />    <!-- 自动扫描路径 -->    <context:component-scan base-package="com.freemarker.aspect.log" />
0 0
原创粉丝点击