如何设计一张合格的日志表

         管理系统的操作日志如何做成通用的模块我觉得一直是一个经久不衰的事。在做企业管理系统时,或多或少都有对数据的完整性有要求,比如要求业务数据不能物理删除记录,要求添加每一条数据时都要有系统记录、或者更新某条数据都需要跟踪到变化的内容、或者删除数据时需要记录谁删除了,何时删除了,以便误删后可以通过系统的某些功能来恢复误删的数据。我将这种功能称为系统操作日志

哪些地方需要记录操作日志?执行insert、update、delete这3个操作的时候,就需要进行日志,而日志执行的先后顺序如下:

insert : 在insert后执行

update:在update前后都要执行,操作前获取操作前数据,操作后获取操作后数据

delete : 在delete前执行

为什么要做操作日志?

      其实上面也描述了一些场景,其主要目的就是跟踪到每一个用户在系统的操作行为,如对数据进行查询、新增、编辑或删除甚至是登录等行为。更进一步的理解可以说是对用户使用系统情况的跟踪,对数据的跟踪防止数据意外删除、更改时有所记录,有所依据,以便对数据的还原,从某种程序上可以保护数据的完整性。


场景:

    有一张表叫t_employee:

idint
namevarchar(50)
gendervarchar(2)
date_createddatetime
create_uservarchar(50)

在jsp页面中可能会有EmployeeEdit.jsp(用来添加或更新Employee信息等操作),EmployeeList.jsp(用来查询或进行删除Employee信息等操作); 现在要对t_employee表操作的信息做一个系统日志,那怎么办?也许你可以建立多一个表跟t_employee表一模一样的,叫做t_employee_log

idint
namevarchar(50)
gendervarchar(2)
date_createddatetime
create_uservarchar(50)
log_createddatetime
operation_typeint

       其中加多了一些附属的信息如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乐园”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构!打造最有价值的架构师圈子和社区。

  • 长按下方的二维码可以快速关注我们

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台管理系统页面操作日志设计与代码实现可以参考以下步骤: 1. 设计数据库结构 可以创建一个名为“sys_log”的来保存操作日志中可以包含以下字段:日志ID、操作人员、操作时间、操作模块、操作类型、操作对象、操作结果等。 2. 编写AOP切面 使用AOP技术,在系统中切入日志记录代码。在AOP切面中,可以通过注解或者切入点来确定需要记录日志的方法,并在方法执行前后记录相关操作日志信息。 3. 编写日志记录代码 在AOP切面中编写日志记录代码,将日志信息保存到数据库中。可以使用Spring JDBC或MyBatis等数据库操作框架来进行数据持久化操作。 4. 集成日志管理模块 可以在系统中集成日志管理模块,将保存的日志信息展示给管理员。管理员可以根据需求查询、导出、删除等日志操作。 以下是一个简单的AOP切面示例,用于记录操作日志: ```java @Component @Aspect public class LogAspect { @Autowired private LogService logService; @Pointcut("execution(* com.example.controller.*.*(..))") public void logPointcut() {} @AfterReturning(pointcut = "logPointcut()") public void doAfterReturning(JoinPoint joinPoint) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); User user = (User) request.getSession().getAttribute("user"); if (user != null) { String username = user.getUsername(); String ip = request.getRemoteAddr(); String method = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName(); String params = Arrays.toString(joinPoint.getArgs()); String operation = "操作描述"; String result = "操作结果"; Log log = new Log(username, ip, method, params, operation, result); logService.saveLog(log); } } } ``` 在上述代码中,@Pointcut注解用于定义切入点,@AfterReturning注解用于定义在方法执行后记录日志的操作。在记录日志时,可以获取当前用户、请求IP、请求方法、请求参数等信息,并将这些信息保存到数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值