系统运维(二):AOP+反射实现 普通操作日志设计
普通操作日志和业务操作日志
在开始做之前,必须把两个日志分清楚,那就是普通操作日志和业务操作日志,这两者有何区别?
在我理解,普通操作日志就是单表的操作记录,而业务操作日志则就是一系列的普通操作日志的集合。
打个比方,用户需要购买一样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是一系列的业务,如:
生成订单 → 生成商品快照 → 发送一条站内信 → 删除购物车里对应宝贝
这样一个下单操作就包含了4部分,可以把这4部分看成是4张表,分别对这4张表进行对应的操作,就实现了业务。
因为不同项目的业务不尽相同,所以它无法做成通用模块,所以下面讲的是普通操作日志。
首先,哪些地方需要记录操作日志?执行insert、update、delete这3个操作的时候,就需要进行日志,而日志执行的先后顺序如下
insert
在insert后执行
update
在update前后都要执行,操作前获取操作前数据,操作后获取操作后数据
delete
在delete前执行
实现的效果展示如下
根据界面可以抽象成2张表,一张主表一张从表,主表记录操作表及操作人等信息,从表记录操作的表字段信息。
下面说说实现日志的管理可以使用过滤器,或者是Spring的拦截器进行日志的处理。
他们的好处,就是配一下就能够切入到系统当中。
如果是用过滤器,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用,然后进行日志记录。使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志。
另外一种就是使用Spring的AOP了,实现简单,只要配置一下配置文件就可以了。但这种方式会拦截下所有的对action或者dao的每个操作,所以效率比较低。
下面我说说使用AOP实现方式在spring中配置。配置在指定包下的指定方法执行前或者后,执行指定类
ModelClassHelper类,主要实现通过反射Object,得到对应的具体类信息这些打印的信息,在实际系统中应该写入数据库。这里有个小问题,通过aop可以得到实体类以及数据信息,这些信息都是通过映射得到的,跟具体业务无关,所以他们对应的名字(表名、字段名)怎么获得,我现在想的是把表的信息在配置文件中保留一份。小结
我们容易着重系统的功能性实现,却忽视日志的作用。日志有系统日志、业务日志、工作日志等。
系统日志可供用户查询指定时间段内对系统的操作记录,也就是上面所说的普通操作日志,正如上面实现那样,跟具体业务无关,像个切片写入系统中,需要时配置下就好了。
业务操作日志则是跟系统的具体业务有关,是一系列的普通操作日志的集合。
工作日志在今目标中可以看到,用来跟踪业务的进展,方便管理者更好的把握工作进展情况,以便及时加以控制,有效调配资源。在今目标里,管理者可以批量查看一个部门或者项目团队成员的日志,跟踪重要事件,及时指导。工作日志还有一个业绩证明的作用,员工的工作量、工作效果在这里得到体现。工作日志,对管理很有帮助的工具。