增加的操作日志记录如何正确记录且不影响正常业务
来源:17-1 权限操作记录模块接口开发

目科将
2018-07-17
学习完老师讲的这节关于操作日志记录的,有几个问题想问下有没有更好的解决方案:
课中讲的日志都是在调用业务服务之后,再调用日志操作记录服务:类似如下:
public void do(){
businessService.save(newB);
sysLogService.saveX(oldB,newB);
}
1.1 这块业务处理do(),真正的业务是 businessService.save(newB),但强加了一段记录操作的日志的服务,会影响业务操作的性能,有没有更好的处理方式
1.2 若 businessService.save(newB) 出错了,但后面的记录操作日志还是会入库,相当于业务操作不成功,但日志却记录了,这也是不正确的,如何处理这种情况 (按上面的描述像把两个操作加在一个事务里就可以,但这好像又回到了上面的问题,业务操作强依赖操作记录了)
2. logType 为何使用接口 而不是枚举,是否枚举更合适一些
3. sysLogService.saveX(oldX,newX) 有没有更通用的方式,因为目前这样多一张表就得加一方法;
1回答
-
1、这里的日志记录已经和普通的日志记录不一样了,因为后面会用它做权限还原。这种的都需要在业务处理时同时保存起来的。如果实在担心,可以考虑加上业务。单独的save操作对性能影响不会很大的,而且本身权限操作也不会特别频繁,如果你实在担心,可以考虑异步保存或者放入队列慢慢处理,也能保证比较不错的数据一致性。
2、对一个单独项目而言,枚举和接口差别并不大。但是对于类似于dubbo那种项目就不一样了,如果这个类是放在api里面的,如果使用枚举的话,升级会变得很麻烦。
3、最初本来我是打算定义一个通用的saveLog接口的。然后让sysRoleService、sysUserService、sysAclService等相关的service都去实现。后来考虑到要对之前的不少的类进行调整,大家在学习时会发现得到的代码和课程视频里的代码很长时间都不一致,甚至会带来行数的变化,因此我选择了最简单的实现方式,当然也是最容易懂的方式。感觉你能问出这个问题来,你有足够的能力可以按照我说的这个方式去调整一下代码了。
032018-07-22
相似问题