一、前言我们在企业级的开发中,必不可少的是对日志的记录,实现有很多种方式,常见的就是基于AOP+注解
进行保存,但是考虑到程序的流畅和效率,我们可以使用异步
进行保存,小编最近在spring和springboot
源码中看到有很多的监听处理贯穿前后:这就是著名的观察者模式
?。?
二、基础环境项目这里小编就不带大家创建了,直接开始?。?
1. 导入依赖小编这里的springboot版本是:2.7.4
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>
2. 编写yml配置server:port: 8088spring:datasource:#使用阿里的Druidtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.239.131:3306/test?serverTimezone=UTCusername: rootpassword: root
三、数据库设计数据库保存日志表的设计,小编一切从简,一般日志多的后期会进行分库分表 , 或者搭配ELK
进行分析,分库分表一般采用根据方法类型,这需要开发人员遵循rest风格
,不然肯定都是post
,纯属个人见解哈?。〈蠹铱梢愿葑约旱墓镜囊蠼胁钩涔 。?
DROP TABLE IF EXISTS `sys_log`;CREATE TABLE `sys_log`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键',`title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块标题',`business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',`method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名称',`request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求方式',`oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人员',`oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求URL',`oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址',`oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1585197503834284034 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
实体类:
import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.time.LocalDateTime;/** * 操作日志记录表 sys_log * */@Data@TableName("sys_log")public class SysLog {private static final long serialVersionUID = 1L;/*** 日志主键*/@TableIdprivate Long id;/*** 操作模块*/private String title;/*** 业务类型(0其它 1新增 2修改 3删除)*/private Integer businessType;/*** 请求方式*/private String requestMethod;/*** 操作人员*/private String operName;/*** 请求url*/private String operUrl;/*** 操作地址*/private String operIp;/*** 操作时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime operTime;}
四、主要功能大体思路:先手写一个注解--->切面来进行获取要保存的数据--->一个发布者来发布要保存的数据--->一个监听者监听后保存(异步)
完整项目架构图如下:
文章插图
1. 编写注解
import com.example.demo.constant.BusinessTypeEnum;import java.lang.annotation.*;/** * 自定义操作日志记录注解 * @author wangzhenjun * @date 2022/10/26 15:37 */@Target(ElementType.METHOD) // 注解只能用于方法@Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期@Documentedpublic @interface Log {String value() default "";/*** 模块*/String title() default "测试模块";/*** 功能*/BusinessTypeEnum businessType() default BusinessTypeEnum.OTHER;}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 装配 SpringBoot自动配置流程
- Springboot 一行代码实现文件上传 20个平台!少写代码到极致
- SpringBoot内置工具类,告别瞎写工具类了
- iOS开发之自定义日历控件
- 基于vite3+tauri模拟QQ登录切换窗体|Tauri自定义拖拽|最小/大/关闭
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- Springboot JSON 转换:Jackson篇
- SpringBoot整合ES+Kibana
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
- 手写自定义springboot-starter,感受框架的魅力和原理