一、定义注解
- 创建注解,注解作用域只在方法上
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ServerLog {
String reqDesc() default "";
String resDesc() default "";
LogRange logRange() default LogRange.ALL;
}
- 定义LogRange枚举类,定义打印日志的范围
@Getter
@AllArgsConstructor
public enum LogRange {
NONE(false, false),
REQ(true, false),
RES(false, true),
ALL(true, true),
;
private boolean printReq;
private boolean printRes;
}
二、AOP拦截日志注解
- 拦截日志注解
@Around(value = "@annotation(serverLog)", argNames = "joinPoint,serverLog")
public Object printLog(ProceedingJoinPoint joinPoint, ServerLog serverLog) throws Throwable {
LogRange logRange = serverLog.logRange();
if (logRange.isPrintReq()) {
String reqDesc = serverLog.reqDesc();
CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
String[] parameterNames = codeSignature.getParameterNames();
if (ArrayUtils.isNotEmpty(parameterNames)) {
StringBuilder logMessage = new StringBuilder(reqDesc);
Object[] parameterMessages = new Object[parameterNames.length * 2];
Object[] parameterObjs = joinPoint.getArgs();
for (int i = 0; i < parameterNames.length; i++) {
logMessage.append(LOG_BLOCK);
parameterMessages[2 * i] = parameterNames[i];
parameterMessages[2 * i + 1] = JSON.toJSONString(parameterObjs[i]);
}
log.info(logMessage.toString(), parameterMessages);
} else {
log.info(reqDesc);
}
}
Object ret = joinPoint.proceed();
if (logRange.isPrintRes()) {
String resDesc = serverLog.resDesc() + " {}";
log.info(resDesc, JSON.toJSONString(ret));
}
return ret;
}