当前位置: 首页 > news >正文

日志记录功能

需求描述:

        1,可记录页面操作模块、按钮的日志记录

        2,记录详细的指定操作数据日志

        3,记录的数据可能需要查询表

        4,需要考虑到扩展性及个性化定制

表结构设计:

CREATE TABLE YES_DEV.T_COMM_OPERATION_LOG (ID BINARY_BIGINT NOT NULL,OPERATOR VARCHAR(128),OPERATION_MODULE VARCHAR(64),OPERATION_OBJECT VARCHAR(128),OPERATION_TYPE VARCHAR(32),OPERATION_CONTENT CLOB,OPERATION_RESULT VARCHAR(8),OPERATION_IP VARCHAR(32),OPERATION_TIME TIMESTAMP,STATUS CHAR,CDATETIME TIMESTAMP,UDATETIME TIMESTAMP,CONSTRAINT T_COMM_OPERATION_LOG_PK PRIMARY KEY (ID)
);

自定义 controller/service层方法注解


import com.taia.yms.auditlog.aop.inter.OperationLogRuleInterface;
import com.taia.yms.auditlog.aop.service.DefaultOperationLogRule;
import java.lang.annotation.*;/*** 操作日志自定义注解* controller-> mapper1,mapper2.....*/@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface OperationLog {/*** controller层* @return 操作的页面名称*/String pageName() default "";/*** 主要是 mapper 执行的类型* 如果有值,则直接取注解上的值;如果没有,则按照自定义规则得到该值* @return*/String type() default "";/*** 执行的规则实现类的方法* @return*/String method() default "parse";/*** 规则实现类* @return*/Class<? extends OperationLogRuleInterface> operation() default DefaultOperationLogRule.class;}
import org.springframework.stereotype.Component;
import java.util.Map;/*** 规则接口*/
@Component
public interface OperationLogRuleInterface {void parse(Map<Integer,Object> map);}

import cn.hutool.json.JSONUtil;
import com.taia.yms.auditlog.aop.inter.OperationLogRuleInterface;
import com.taia.yms.auditlog.aop.model.OperationLogModel;
import com.taia.yms.auditlog.entity.OperationLog;
import com.taia.yms.config.ThreadLocalConf;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;@Slf4j
public class DefaultOperationLogRule implements OperationLogRuleInterface {@Overridepublic void parse(Map<Integer,Object> map) {log.info("parse map:{}",map);//controller后置处理 默认将所有的contentMap转化为JSON串输出,如果需要自定义,重新定义规则类OperationLogModel operationLogModel = (OperationLogModel)ThreadLocalConf.getValue(OperationLogModel.class.getName());OperationLog operationLog = operationLogModel.getOperationLog();Map<String, Object> contentMap = operationLogModel.getOperationContentMap();operationLog.setOperationContent(JSONUtil.toJsonStr(contentMap));}
}

核心对象设计


import com.taia.yms.auditlog.entity.OperationLog;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;@Data
@Slf4j
public class OperationLogModel {private OperationLog operationLog;/*** 记录对应的mapper实例*/private Map<String,Object> beanMapperMap = new HashMap<>(5);/*** 存储所有 mapper层的字段数据*/private Map<String,Object> operationContentMap = new HashMap<>(10);/*** 新增 Operation* @return*/public OperationLog getOperationLog(){if(operationLog == null){operationLog = new OperationLog();}return operationLog;}}

实体对象OperationLog


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.sql.Timestamp;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class OperationLog {private String operationContent;private Timestamp operationTime;private String operator;private String operationModule = "DataGovernanceServer";private String operationObject;private String operationType;private String operationResult = "1";private String operationIp;// 前后比较的对象,默认是比较一层,多层需要重写private Object oldObject;private Object newObject;private Object insertJson;private List<List<LogCo
http://www.lryc.cn/news/382827.html

相关文章:

  • Android中的多线程与线程池详解
  • 使用LangChain+Ollama自己做的一个和大语言模型聊天的网站支持上下文对话,学习记录。
  • excel数据透视
  • 七、(正点原子)Linux并发与竞争
  • vue2+TS,el-table表格单选的写法
  • 北邮《计算机网络》蒋老师思考题及答案-传输层
  • 学懂C#编程:常用高级技术【元组的详细使用】——利用元组获取多个返回值
  • 解决IDEA使用卡顿的问题,设置JVM内存大小和清理缓存
  • Python爬虫从入门到入狱之爬取知乎用户信息
  • apk反编译修改教程系列-----去除apk软件更新方法步骤列举 记录八种最常见的去除方法
  • SpringMVC系列六: 视图和视图解析器
  • MySQL数据备份的分类
  • node+nginx实现对react进行一键打包部署--windows版
  • 【机器学习】基于Gumbel-Sinkhorn网络的“潜在排列问题”求解
  • create-react-app创建的项目中设置webpack配置
  • 【ai】tx2 nx :安装torch、torchvision for yolov5
  • 【报错】在终端中输入repo命令后系统未能识别这个命令
  • 【机器学习】K-Means算法详解:从原理到实践
  • 解决qiankun项目与子应用样式混乱问题
  • 黑产当前,如何识别异常图片?
  • 数据模型(models)
  • 【CS.AL】算法核心之贪心算法 —— 力扣(LeetCode)743. 网络延迟时间 - Dijkstra算法题解
  • 25、架构-微服务的驱动力
  • JeecgFlow事件网关概念及案例
  • 使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面
  • iOS 中 attribute((constructor)) 修饰的函数
  • 原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦
  • C语言入门课程学习笔记9:指针
  • 借助 Cloudflare D1 和 Drizzle 在 Astro 上实现全栈
  • SUSE linux 15的网络管理