《我们已经不用AOP做操作日志了!.docx》由会员分享,可在线阅读,更多相关《我们已经不用AOP做操作日志了!.docx(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、我们已经不用AOP做操作日志了!来源|JAVA葵花宝典责编|王晓曼、Carol头图|CSDN下载自东方IC前言用户在操作我们系统的经过中针对一些重要的业务数据进展增删改查的时候我们祈望记录一下用户的操作行为以便发生问题时能及时的找到根据这种日志就是业务系统的操作日志。本篇我们来讨论下常见操作日志的实现方案以及可行性常见的操作日志类型用户登录日志重要数据查询日志但电商可能不重要的数据也做埋点比方在淘宝上你搜索什么商品即使不买一段时间内首页也会给你推荐类似的东西重要数据变更日志如密码变更权限变更数据修改等数据删除日志.总结来讲就是重要的增删改查根据业务的需要来做操作日志的埋点。实现方案比照1、基于
2、AOP切面传统的实现方案优点实现思路简单缺点增加数据库的负担强依赖前端的传参不方便拓展不支持批量操作不支持多表关联2、基于数据库Binlog优点解除了数据新旧变化的耦合支持批量操作方便多表关联拓展不依赖开发语言缺点数据库表设计需要统一的约定方案实现细节1、基于AOP切面注解的传统方案传统的做法就是切面注解的方式这种对代码的侵入性不强通常记录ip、业务模块、操作账号、操作场景、操作来源等等一般在注解拦截器里这些值都拿得到如下列图所示这种常见的我们在通用方法都可以处理但是在数据变更方面一直没有较好的实现方式比方数据在变更前是多少变更后是多少。以我们以前实现的一套方案来讲基于数据变更的记录方式不仅要
3、以及需求方约定好模板上百个字段的不可能都做展示以及记录也要以及前端做一些约定比方在修改之前的值是多少修改后的值是多少如下代码客观请看ValidNotNull(message新值不能为空)UpdateNewDataOperationLogprivateTnewData;ValidNotNull(message旧值不能为空)UpdateOldDataOperationLogprivateToldData;存在的问题旧值假如不多查询一次数据库那么需要依赖前端把旧值封装到oldData对象中很有可能已经不是修改前的值无法处理批量的List数据不支持多表操作再以一个场景为例再删除之前需要记录删除前的值是
4、不是还得再查一次PostMapping(/delete)ApiOperation(value删除用户信息,notes删除用户信息)DeleteOperationLog(systemSystemNameNewEnum.SYS_JMS_LMDM,moduleModuleNameNewEnum.LMDM_AUTH,tableLogBaseTableNameEnum.TABLE_USER,methodNamedetail)2、基于数据库Binlog方案系统架构图如下主要分为3块业务应用生成每次操作的traceid并更新到操作的业务表中发送1条业务消息包含当前操作的操作人相关的信息日志采集应用对业务日志
5、以及转换后的binlog日志做整合提供对外的日志查询搜索API日志处理应用利用canal收集以及解析业务库的binlog日志并投递到kafka中实现方案可以参考?怎样基于Canal以及Kafka实现MySQL的Binlog近实时同步?解析后的记录中记录了当前操作的操作类型如属于删除、修改、新增,以及新旧值的记录格式如下data:id:122158992930664499,bill_type:1,create_time:2020-04-2609:15:13,update_time:2020-04-2613:45:46,version:2,trace_id:exclude-f04ff706673d
6、4e98a757396efb711173,database:yl_spmibill_8,es:1587879945200,id:17161259,isDdl:false,mysqlType:id:bigint(20),bill_type:tinyint(2),create_time:timestamp,update_time:timestamp,version:int(11),trace_id:varchar(50),old:update_time:2020-04-2613:45:45,version:1,trace_id:exclude-36aef98585db4e7a98f9694c8ef
7、28b8c,pkNames:id,sql:,sqlType:id:-5,bill_type:-6,create_time:93,update_time:93,version:4,trace_id:12,table:xxx_transfer_bill_117,ts:1587879945698,type:UPDATE处理完Binlon日志转换后的操作日志id:120716921250250776,relevanceInfo:XX0000097413282,remark:签收财务网点编码由【】改为【380000】签收网点名称由【】改为【泉州南安网点】签收网点code由【】改为【2534104】运单状
8、态code由【204】改为【205】签收财务网点名称由【】改为【福建代理区】签收网点id由【0】改为【461】签收标识,1是0否由【0】改为【1】签收时间由【null】改为【2020-04-2421:09:47】签收财务网点id由【0】改为【400】,traceId:120716921250250775库表设计所有业务系统表需要添加trace_id字段每次操作生成一个随机字符串并保存到业务表中日志采集应用库表设计。CREATETABLEtable_config(idbigint(20)NOTNULLAUTO_INCREMENTCOMMENTid,database_namevarchar(50)
9、CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT数据库名,table_namevarchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT数据库表名,PRIMARYKEY(id),UNIQUEKEYunq_data_name_table_name(database_name,table_name)USINGBTREECOMMENT数据库名表名结合索引)ENGINEInnoDBAUTO_INCREMENT35DEFAULTCHARSET
10、utf8mb4COLLATEutf8mb4_0900_ai_ciCOMMENT数据库配置表CREATETABLEtable_field_config(idbigint(20)NOTNULLAUTO_INCREMENT,table_config_idbigint(20)DEFAULTNULL,fieldvarchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT字段数据库,field_namevarchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAU
11、LTNULLCOMMENT字段中文名称,enum_flagtinyint(2)DEFAULTNULLCOMMENT是否枚举字段(1:是,0:否),relevance_flagtinyint(2)DEFAULTNULLCOMMENT是否是关联字段(1:是,0否),sortint(11)DEFAULTNULLCOMMENT排序,PRIMARYKEY(id),KEYidx_table_config_id(table_config_id)USINGBTREECOMMENT表ID索引)ENGINEInnoDBAUTO_INCREMENT2431DEFAULTCHARSETutf8mb4COLLATEut
12、f8mb4_0900_ai_ciCOMMENT数据库字段配置表CREATETABLEtable_field_value(idbigint(20)NOTNULL,field_config_idbigint(20)DEFAULTNULL,field_keyvarchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT枚举,filed_valuevarchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT枚举名称,PRIMARYKE
13、Y(id),KEYids_field_config_id(field_config_id)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb4COLLATEutf8mb4_0900_ai_ciCOMMENT数据字典配置表效果3、基于Binlog实现方案将来规划优化发送业务消息的实现使用切面拦截减少对业务代码的侵入目前暂时不支持对多表关联操作日志记录需要拓展。总结本文以操作日志为题材讨论了操作日志的实现方案以及可行性并且都已经在功能上进展实现其中使用AOP方案也是大局部中小企业的首选实现方案但是在一些金融领域和ERP相关系统对操作日志记录明细要求极高常见技术方案很难知足。即使可以知足也会带来一些代码强侵入和性能问题所以我们又讨论了基于Binlog实现的方案该方案固然比对AOP来讲增强了技术的复杂性但是对于有一定技术积累的团队来讲不算什么难事并且该方案我们都实现了上线并且解决了代码层面上的侵入属于跨语言级别的相信对读者还是有一定的启发。推荐浏览一文带你从头认识什么是缓存真香朕在看了
限制150内