More
More
文章目录
  1. 需求描述
  2. 关键代码
  3. 推荐参考

Springboot之AOP实现系统日志

需求描述

封装方法记录增删改查等操作日志。为了尽可能的解耦,使用自定义的AOP切点来实现。

关键代码

  • LogAnnotation.java,自定义注解声明。这里定义了4个参数,其中logType为枚举类型;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import com.mes.common.EMESConsts.SystemLogType;
    /**
    * 自定义日志注解
    *
    * 创建人:che
    * 创建时间:2018年1月19日 下午2:24:09
    *
    * @Retention 描述注解的生命周期
    * @Target 描述注解的使用范围
    * @Inherited 允许继承
    * @Documented 注解归档
    */
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    @Inherited
    @Documented
    public @interface LogAnnotation {
    String logModule() default "";
    String logFunction() default "";
    SystemLogType logType() default SystemLogType.SYS;
    String logContent() default "";
    }
1
2
3
4
// 系统日志操作类型
public enum SystemLogType {
SYS,VIEW,INSERT,UPDATE,DELETE,LOGIN,LOGOUT,IMPORT,EXPORT
}
  • LogAspect.java,切面监听,相应处理;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.lang.reflect.Method;
import java.util.Date;
import javax.annotation.Resource;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.mes.annotation.LogAnnotation;
import com.mes.dao.SysSystemLogMapper;
import com.mes.pojo.UserObject;
import com.mes.pojo.po.SysSystemLog;
@Component
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Resource
private SysSystemLogMapper mapper;
@Pointcut("execution(* com.mes.service..*(..))")
private void pointcut() {
}
@After(value = "pointcut()")
public void After(JoinPoint joinPoint) throws ClassNotFoundException {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
Class<?> targetClass = Class.forName(className);
Method[] methods = targetClass.getMethods();
for (Method method : methods) {
if (method.getName().equalsIgnoreCase(methodName)) {
Class<?>[] clazzs = method.getParameterTypes();
if (clazzs.length == args.length) {
LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);
if (logAnnotation != null) {
String logContent = logAnnotation.logContent();
String logModule = logAnnotation.logModule();
String logFunction = logAnnotation.logFunction();
int logType = logAnnotation.logType().ordinal();
logger.info("获取日志:{}-{}-{}", logModule, logFunction, logContent);
// 数据库记录操作...
UserObject userObject = (UserObject) SecurityUtils.getSubject().getSession().getAttribute("userObject");
// 未登录 不记录
if(userObject != null) {
SysSystemLog log = new SysSystemLog();
log.setIp(userObject.getUserRemoteIP());
log.setContent(logContent);
log.setModule(logModule);
log.setFunction(logFunction);
log.setType(logType+"");
log.setCreateId(Long.parseLong(userObject.getEmpId()));
log.setModifyId(Long.parseLong(userObject.getEmpId()));
Date date = new Date();
log.setCreateDate(date);
log.setModifyDate(date);
logger.info(log.toString());
mapper.insertSelective(log);
}
break;
}
}
}
}
}
}
  • 使用
1
2
@LogAnnotation(logModule = "框架", logFunction = "系统日志", logContent = "日志一览", logType = EMESConsts.SystemLogType.VIEW)
public List<QuerySystemLogDTO> listByCriteria(CriteriaEntity<QuerySystemLogDTO> entity) { }

推荐参考

  1. 使用Spring AOP记录Controller层操作日志
  2. springboot使用注解的方式记录用户业务操作
  3. SpringBoot详解(四)-优雅地处理日志

更多有意思的内容,欢迎访问笔者小站: rebey.cn

打赏
手机扫一扫,支持CHE~