话不多说,直接上代码:
/**
* 自定义日志记录
*/
@Documented
@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface OptionalLog {
/**
* 日志模块
*
* @return
*/
String module() default "";
/**
* 记录日志的操作类型,日志说明
*/
String operateType() default "";
}
定义切面:
/**
* 切面日志
*
* @author lpz
*/
@Slf4j
@Aspect
@Component
public class OptionalLogAop {
// 配置接入点,即为所要记录的action操作目录
@Pointcut("execution(* com.cmcc.hy.portray.api.controller..*.*(..))")
private void controllerAspect() {
}
@Around("controllerAspect()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 拦截的放参数类型
Signature sign = joinPoint.getSignature();
if (!(sign instanceof MethodSignature)) {
log.error("该注解只能用于方法, OptionalLog only use for method... {}", sign);
// throw new IllegalArgumentException("该注解只能用于方法");
}
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method currentMethod = methodSignature.getMethod();
// 获取方法(此为自定义注解)
OptionalLog annot = currentMethod.getAnnotation(OptionalLog.class);
if (Objects.isNull(annot)) {
return joinPoint.proceed();
}
// 拦截的方法名称。当前正在执行的方法
String methodName = methodSignature.getName();
//
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
// 从session获取用户名
String userName = (String) request.getSession().getAttribute(SessionConstants.SESSION_KEY_USERNAME);
// 获取系统当前时间
String recordTime = DateUtil.formatDateToStr(new Date(), DateUtil.FORMATSTR_YYYY_MM_DD_HHMMSS);
// 获取访问真实IP
String ipAddress = IpUtil.getRequestIp();
//获取请求路径
String requestURI = request.getRequestURI();
// 获取注解的modules 设为操作模块, 设为执行方法
String module = annot.module();
String operateType = annot.operateType();
//接受客户端的数据
StringBuilder paramsBuild = new StringBuilder();
Map<String, String[]> maps = request.getParameterMap();
maps.forEach((s, strings) -> {
for (String string : strings) {
paramsBuild.append(s).append("-").append(string).append(",");
}
});
String params = paramsBuild.toString();
params = StringUtil.isBlank(params) ? params : params.substring(0, params.length() - 1);
Object[] arguments = joinPoint.getArgs();
for (Object argument : arguments) {
System.out.println(argument);
}
// 执行目标方法,获得返回值。response
Object result = null;
try {
result = joinPoint.proceed();
} catch (Exception e) {
log.error("处理响应结果异常response exception, {}", e.getMessage(), e);
} finally {
log.info("OptionalLog record... userName:{}, requestURI:{}, params:{}, module:{}, operateType:{}, ip:{}, result:{}, recordTime:{}",
userName, requestURI, params, module, operateType, ipAddress, result, recordTime);
}
return result;
}
}
添加注解:
/**
* 导出模型分析结果excel
*/
@OptionalLog(module = "操作日志", operateType = "导出模型分析结果")
@RequestMapping(value = "/exportModel", method = RequestMethod.GET)
@ApiOperation(value = "导出模型分析结果", notes = "导出模型分析结果")
public String exportModel(Long id, HttpServletResponse response) {
return modelResultInfoService.exportModel(id, response);
}
打印形式:
2019-12-05 10:45:56.334 INFO 64116 [io-8800-exec-28] hy.portray.api.common.aop.OptionalLogAop 95 : OptionalLog record... userName:tscmail, requestURI:/customgroup/query/export, params:id-79, module:操作日志, operateType:导出客群数据, ip:172.18.34.133, result:嘿嘿嘿.xls, recordTime:2019-12-05 10:45:54
2019-12-05 10:45:56.334 INFO 64116 [io-8800-exec-28] hy.portray.api.common.aop.OptionalLogAop 95 : OptionalLog record... userName:tscmail, requestURI:/customgroup/query/export, params:id-79, module:操作日志, operateType:导出客群数据, ip:172.18.34.133, result:嘿嘿嘿.xls, recordTime:2019-12-05 10:45:54