![]() | 1 wd 2021-11-27 06:45:02 +08:00 via iPhone 数据库 trigger |
![]() | 2 MIUIOS 2021-11-27 08:01:12 +08:00 via iPhone ![]() 我的做法是 binlog ,用 canal 解析 binlog 在写入日志数据库,同步到 es , 完全和业务层解偶,缺点是无法记录用户的 ip 等,不过业务日志只要记录业务行为就行了,剩下的交给系统日志 |
![]() | 3 taloricag OP @totoro52 谢谢大佬,但是场景不太符合我,因为我的场景不是完全跟业务解耦,还有条件触发,比如修改了 A 字段需要发个邮件,修改了 B 字段发个通知这种,给我整蒙了 |
![]() | 4 rrfeng 2021-11-27 09:54:20 +08:00 via Android gorm 有 hooks 啊 |
5 cs419 2021-11-27 09:58:52 +08:00 client 驱动层 修改 github.com/go-sql-driver/mysql 进行 aop |
![]() | 6 fgwmlhdkkkw 2021-11-27 10:12:30 +08:00 via Android 只记请求和 sql ,然后再用 sql 解析器,取出来字段。 |
![]() | 7 MIUIOS 2021-11-27 11:24:58 +08:00 ![]() @taloricag 一样可以 只要你的表设计有更新人这类似的字段,可以取出来在回表去查通知,如果你的表设计没有更新人和创建人那就不行了 |
9 Fule 2021-11-29 09:58:47 +08:00 SQL Server 2016+ 有 Temporal Table ,自动维护整行历史记录,一定程度上有助于这类问题,不知道其它数据库是否有类似特性: https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2016 |
![]() | 10 shigella 2021-11-29 10:00:03 +08:00 canal |
![]() | 11 cnit 2021-11-29 16:28:51 +08:00 ``` java @Component @CanalTable("table_name") public class OrderHeaderHandler implements EntryHandler { @Autowired private XxxService xxxService; @Override public void update(Map<String, String> before, Map<String, String> after, Set<String> updateColumns) { //获取需要记录日志的列 Map<String, String> filedMap = FieldUtils.objectToMap(TableName.class, updateColumns); String tableId= before.get("tableId"); String records = ""; if (filedMap != null && filedMap.keySet().size() > 0) { for (String update : filedMap.keySet()) { String comment = filedMap.get(update); String beforeValue = before.get(update); String afterValue = after.get(update); records = records.concat(String.format("%s 由 %s 改为 %s", comment, StringUtils.isEmpty(beforeValue) ? "空" : beforeValue , StringUtils.isEmpty(afterValue) ? "空" : afterValue) + ";"); } //记录日志 OperationRecords operatiOnRecords= new OperationRecords(); operationRecords.setLinkedId(Long.parseLong(orderId)); operationRecords.setRecords(records); operationRecords.setTableName("container_transport_order_header"); operationRecords.setCreateTime(new Date()); operationRecords.setCreateUserId(parseLongUserId(after.get("updateUserId"))); operationRecordsService.save(operationRecords); } } ``` |
12 onhao 2021-11-29 17:00:00 +08:00 |