自定义注解 打印,入参,出参,执行时间,上传文件

package com.*.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    /**
     * log 说明
     *
     * @return
     */
    String value() default "";

    /**
     * 是否忽略,比如类上面加的有注解,类中某一个方法不想打印可以设置该属性为 true
     *
     * @return
     */
    boolean ignore() default false;
}

自定义注解类 Log.java

------------------------------------------------------------------------------------------------------

package com.*.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

/**
 * 
 */
@Aspect
@Order(100)
@Component
public class AccessLogInfo {

    private static final Logger log = LoggerFactory.getLogger(AccessLogInfo.class);
    private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
    private static final String STRING_START = "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n";
    private static final String STRING_END = "\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n";

    @Pointcut("execution(* com.*.app..service.impl..*(..)) || execution(* com.*.app.web.rest..*(..))")
    public void serviceLog() {
    }

    @Around("serviceLog()")
    public Object around(ProceedingJoinPoint joinPoint) {
        try {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            Class<?> targetClass = method.getDeclaringClass();
            StringBuffer classAndMethod = new StringBuffer();
            Log classAnnotation = targetClass.getAnnotation(Log.class);
            Log methodAnnotation = method.getAnnotation(Log.class);
            if (classAnnotation != null) {
                if (classAnnotation.ignore()) {
                    return joinPoint.proceed();
                }
                classAndMethod.append(classAnnotation.value()).append("-");
            }
            if (methodAnnotation != null) {
                if (methodAnnotation.ignore()) {
                    return joinPoint.proceed();
                }
                classAndMethod.append(methodAnnotation.value());
            }
            String target = targetClass.getName() + "#" + method.getName();
            String params = "";
            List<Object> objects = Arrays.asList(joinPoint.getArgs());
            for (Object object : objects) {
                if(object instanceof MultipartFile){
                    MultipartFile file = (MultipartFile)object;
                    params += file.getOriginalFilename();
                }else if(object instanceof MultipartFile[]){
                    MultipartFile[] files = (MultipartFile[])object;
                    for (MultipartFile file : files) {
                        params += file.getOriginalFilename()+"-";
                    }
                }else {
                    params += object.toString()+",";
                }
            }
            log.info(STRING_START + "{} 开始调用--> {} 参数:{}", classAndMethod.toString(), target, params);

            long start = System.currentTimeMillis();
            Object result = joinPoint.proceed();
            long timeConsuming = System.currentTimeMillis() - start;

            log.info("\n{} 调用结束<-- {} 返回值:{} 耗时:{}ms" + STRING_END, classAndMethod.toString(), target, result, timeConsuming);
            return result;
        } catch (Throwable throwable) {
            log.error(throwable.getMessage(), throwable);
        }
        return null;
    }

}

AOP切面  AccessLogInfo.java

下面是转载出处 我自己加了一个文件判断。转载的如果入参是文件的话 会报错,我对入参做了一次判断

上一篇:问题记录:使用MultipartFile不上传文件出现异常


下一篇:题解 ABC233F Swap and Sort