springboot 注解日志实现

springboot AOP+日志的注解实现

2017年12月08日 15:12:19

阅读数:534

注解文件:


@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InvokeLog {
    String name() default "";
    String description() default "";
    boolean printReturn() default true;
}

切面类:


@Aspect
@Component
public class InvokeLogAspect {


    public static final Logger logger = LoggerFactory.getLogger(InvokeLogAspect.class);
    // 执行最大时间 超过该时间则警告
    private static final int DEFAULT_TIME_LIMIT = 3000;
    private static final String MSG = "--请求--\n --方法:{}\n --描述:{}\n --位置:{}\n --参数:{}\n --返回:{}\n --耗时:{} ms";

    // 切点`
    @Pointcut("@annotation(com.common.annotation.InvokeLog)")
    public void executePointCut() {

    }


    // around 切面强化
    @Around("executePointCut()")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        if (logger.isDebugEnabled() || logger.isWarnEnabled()) {
            StopWatch clock = new StopWatch();
            clock.start();
            Object retrunobj = null;
            try {
                // 注意和finally中的执行顺序 finally是在return中的计算结束返回前执行
                return retrunobj = joinPoint.proceed(args);
            } catch (Exception e) {
                throw e;
            } finally {
                clock.stop();
                long totalTime = clock.getTotalTimeMillis();
                // 打印日志
                handleLog(joinPoint, args, retrunobj, totalTime);
            }
        } else {
            return joinPoint.proceed(args);
        }


    }



    /**
     * 日志处理
     *
     * @param joinPoint 位置
     * @param args      参数
     * @param retrunobj 响应
     * @param totalTime  耗时ms
     */
    private void handleLog(ProceedingJoinPoint joinPoint, Object[] args, Object retrunobj, long totalTime) {
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        InvokeLog invokeLog = method.getAnnotation(InvokeLog.class);
        printLogMsg(invokeLog.name(), invokeLog.description(), invokeLog.printReturn(), joinPoint, args, retrunobj, totalTime);

    }

    /**
     * @param name            操作名称
     * @param description     描述
     * @param printReturn     是否打印响应
     * @param joinPoint       位置
     * @param args            参数
     * @param returnObj       响应
     * @param totalTimeMillis 耗时ms
     */
    protected void printLogMsg(String name, String description, boolean printReturn, JoinPoint joinPoint, Object[] args, Object returnObj, long totalTimeMillis) {
        Object[] params = argsDemote(args);
        if (totalTimeMillis < DEFAULT_TIME_LIMIT)
            logger.info(MSG, new Object[]{name, description, joinPoint.getStaticPart(), params, getPrintMsg(printReturn, returnObj), totalTimeMillis});
        else
            logger.warn(MSG, new Object[]{name, description, joinPoint.getStaticPart(), params, getPrintMsg(printReturn, returnObj), totalTimeMillis});
    }



    private String getPrintMsg(boolean printReturn, Object returnObj) {
        return printReturn ? ((returnObj != null) ? JSONObject.toJSONString(returnObj) : "null") : "[printReturn = false]";
    }

    private Object[] argsDemote(Object[] args) {
        if (args == null || args.length == 0) {
            return new Object[]{};
        }
        Object[] params = new Object[args.length];
        for (int i = 0; i < args.length; i++) {
            Object arg = args[i];
            if (arg instanceof ServletRequest || arg instanceof ServletResponse || arg instanceof ModelMap
                    || arg instanceof Model || arg instanceof InputStreamSource ||
                    arg instanceof File) {
                params[i] = args.toString();
            } else {
                params[i] = args[i];
            }
        }
        return params;
    }

}

调用:
在controller方法前加上

    @InvokeLog(name = "method name", description = "方法描述")

猜你喜欢

转载自blog.csdn.net/HiBoyljw/article/details/81867087