首先定义一个切面注解实现自己想记录的东西
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RecordLog {
/**
* 日志内容
*
* @return
*/
String value() default "";
/**
* 日志类型
*
* @return 0:操作日志;
*/
int logType() default 0;
}
然后写一个切面配置类 具体实现
@Aspect
@Component
public class AutoLogAspect {
@Autowired
private SysRecordLogDao sysRecordLogDao;
@Pointcut("@annotation(com.test.recordLog.annotation.RecordLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
// 执行方法
Object result = point.proceed();
// 执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
// 保存日志
saveSysLog(point, time, result);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object result) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysRecordLog sysLog = new SysRecordLog();
RecordLog syslog = method.getAnnotation(RecordLog.class);
if (syslog != null) {
// 注解上的描述,操作日志内容
sysLog.setLogContent(syslog.value());
sysLog.setLogType(syslog.logType());
}
// 请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
// 请求的参数
Object[] args = joinPoint.getArgs();
try {
if (ArrayUtils.isNotEmpty(args)) {
List<Object> logArgs = Arrays.stream(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
.collect(Collectors.toList());
sysLog.setRequestParam(JSON.toJSONString(logArgs));
} else {
sysLog.setRequestParam(null);
}
// 获取登录用户信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
sysLog.setUsername(getLoginName(request));
// 获取URL
sysLog.setRequestUrl(request.getRequestURI());
// 获取请求类型
sysLog.setRequestType(request.getMethod());
// 设置IP地址
sysLog.setIp(IpUtil.getIpAddr(request));
} catch (Exception e) {
}
try {
sysLog.setResponseResult(ObjectUtils.toString(result));
} catch (Throwable e) {
e.printStackTrace();
}
// 耗时
sysLog.setCostTime(time);
sysLog.setCreatedDate(new Date());
// 保存系统日志
sysRecordLogDao.insert(sysLog);
}
public String getLoginName(HttpServletRequest request) {
String loginName = request.getHeader("loginName");
if (loginName != null) {
return loginName;
}
return "system";
}
}
然后再需要添加记录日志的接口的地方添加上注解ok了