最近因为某个项目的需要,需要做一个全局的操作日志来记录整个系统,方便进行操作日志硕源。对于这里一般来说有工作经验的小伙伴一般第一时间会想到使用注解的形式来完成,因此这里我们记录下对应的实战代码。
一、编写log注解
这里主要是编写一个log相关的注解,用来放在每一个方法上面,log注解对应的代码如下:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
//为操作日志起个名称
String value() default "";
//定义操作日志的业务模块类型,例如:1、订单业务,2、用户业务
String type() default "";
//定义操作日志的操作行为,例如:1、增加,2、删除,3、修改,4、查询
String opType() default "";
}二、编写log注解切面实现逻辑
定义了注解,那么接下来就要去实现对应的注解逻辑,这里由于涉及系统主要是用于把操作日志放到数据库中,因此这里编写的逻辑是把记录存储到数据库中即可,示例代码如下:
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.lr.mxsf.mxsffw.domain.SysLog;
import com.lr.mxsf.mxsffw.log.annotation.Log;
import com.lr.mxsf.mxsffw.service.SysLogService;
import com.lr.mxsf.mxsffw.utils.IpUtils;
import com.lr.mxsf.mxsffw.utils.StringUtils;
import java.lang.reflect.Method;
import java.util.Arrays;
import javax.servlet.http.HttpServletRequest;
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.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@EnableAspectJAutoProxy
@Aspect
@Component
@Slf4j
public class LogAspect {
//日志服务
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.demo.annotation.Log)")
public void logPointCut() {}
/**
编写实践
*/
@Around("logPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
Log logAnnotation = method.<Log>getAnnotation(Log.class);
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
//获取注解填写的信息,从logAnnotation对象获取即可
//获取className
String className = joinPoint.getTarget().getClass().getName();
//获取methodName
String methodName = joinPoint.getSignature().getName();
//获取请求参数
Arrays.toString(joinPoint.getArgs());
//获取request
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//最后根据拼装,使用service把数据存储进去即可。
//最后记得return result即可
return result;
}三、使用切面
最后在需要使用到的接口上面添加上对应的注解即可,示例如下:
@Log(value = "添加订单", opType =BusinessDomain.Order , type = Operator.Add)
@GetMapping({"/addOrder"})
@ApiOperation(")
public BaseResponse addOrder() {
return BaseResponse.ok();
}以上就是添加注解实现记录操作日志的全流程案例。









还没有评论,来说两句吧...