管理系统的操作日志如何做成通用的模块我觉得一直是一个经久不衰的事。在做企业管理系统时,或多或少都有对数据的完整性有要求,比如要求业务数据不能物理删除记录,要求添加每一条数据时都要有系统记录、或者更新某条数据都需要跟踪到变化的内容、或者删除数据时需要记录谁删除了,何时删除了,以便误删后可以通过系统的某些功能来恢复误删的数据。我将这种功能称为系统操作日志。
哪些地方需要记录操作日志?执行insert、update、delete这3个操作的时候,就需要进行日志,而日志执行的先后顺序如下:
insert : 在insert后执行
update:在update前后都要执行,操作前获取操作前数据,操作后获取操作后数据
delete : 在delete前执行
为什么要做操作日志?
其实上面也描述了一些场景,其主要目的就是跟踪到每一个用户在系统的操作行为,如对数据进行查询、新增、编辑或删除甚至是登录等行为。更进一步的理解可以说是对用户使用系统情况的跟踪,对数据的跟踪防止数据意外删除、更改时有所记录,有所依据,以便对数据的还原,从某种程序上可以保护数据的完整性。
场景:
有一张表叫t_employee:
id | int |
name | varchar(50) |
gender | varchar(2) |
date_created | datetime |
create_user | varchar(50) |
在jsp页面中可能会有EmployeeEdit.jsp(用来添加或更新Employee信息等操作),EmployeeList.jsp(用来查询或进行删除Employee信息等操作); 现在要对t_employee表操作的信息做一个系统日志,那怎么办?也许你可以建立多一个表跟t_employee表一模一样的,叫做t_employee_log:
id | int |
name | varchar(50) |
gender | varchar(2) |
date_created | datetime |
create_user | varchar(50) |
log_created | datetime |
operation_type | int |
其中加多了一些附属的信息如log_created(日志添加日期)和operation_type(查询、新增、删除、更新)。此时这种情况可能大家在做用户登录日志的时候是一件很常见的事件。但是问题来了,假如我需要对表t_employee_income(员工的收入情况)做日志那怎么办?好建立多一张表叫t_employee_income_log来记录员工收入情况的操作日志。假如又需要对表t_fixed_asset(固定资产)进行日志记录那又怎么办?大家可能意识到这样做不但会造成表数量的增倍,而且大大的增加了工作量和开发时间,对数据库表不易管理等情况。
因此我们需要一个能够通过简单的配置和编写就可以完成以上功能的日志管理的数据库设计
包括三个表,
LogSetting(日志设置):用来存储配置业务表名、业务名称、主键等
LogSettingDetail(日志设置明细):用来存储配置业务表需要记录的详细内容,如Employee表中,我们可能需要记录字段Name、Gender等信息。
LogOperation(操作日志):用来记录用户对各种业务操作的内容情况。
参考:http://www.cnblogs.com/hooray/archive/2012/09/05/2672133.html
http://www.cnblogs.com/samlin/archive/2010/02/08/log-operation-management.html
看完本文有收获?请转发分享给更多人
欢迎关注“JAVA乐园”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构!打造最有价值的架构师圈子和社区。
长按下方的二维码可以快速关注我们