如何建立你的日志系统

前言

这段时间罐头在开发公司的一个工作流系统,这个系统需要一个强壮的日志记录功能。基本需求如下:

  1. 所有该系统的用户登录、登出需要记录日志
  2. 用户在该系统进行的任何操作需要记录日志
    (换言之,所有数据库的增删改都需要记录)
  3. 在每个子功能下面显示动态模板,管理员可以方便地查看日志。日志必须正确地显示每个字段的注释意义,而且还需要显示新值旧值
  4. 管理员可以为本子功能模块下面的日志添加和修改备注。
  5. 管理可以操作批量展开/闭合日志,对日志列表顺序/逆序展示。

讨论

说实话,看到需求的时候确实有点无语了,就差没bibi了。没法子,谁叫开发是万能的。

我们先抛开145:无谓的登陆/登出,展开/闭合,顺序/逆序……集中思路来看看这个23。我们讨论这个强壮的日志系统是否可以实现?

所有数据库增删改都需要记录

换言之,第一,我们需要设计一个适用所有场景的日志表结构。总不可能为每张表都建立一张与之对应的日志表吧。第二,整个系统必须符合MVC设计,我们需要把写日志的接口建立在model层。

需要一个解析日志通用接口

需求提到需要显示字段注释的意义,还要显示新值和旧值。基本思路是,我们在记录日志时,存放差异集合。差异集合必须包含字段名、新值、老值、字段类型、字段注释。这才有可能正确地展示日志。

思路

通用的日志表

记录对应哪张表的日志信息:relate_table、relate_id
记录操作者信息:operator、 operate_time、 operate_msg
记录触发按钮、或者可以说是触发方法:trigger
记录类型 - 增删改,有利于后面解析日志:type
记录父子级关系,主要处理关联表日志:parent
记录修改字段和数据值:restore_arr

id relate_table relate_id operator operate_time operate_msg trigger type parent restore_arr
id 关联表 关联表主键 操作者 操作时间 操作备注 触发按钮 类型 父级 新老数据(json格式)
restore_arr的数据结构

restore_arr字段是以json格式记录了差异集合的,这种设计才使得历史表变得通用成为现实。下面来看看restore_arr的设计:

1
2
3
4
5
restore_arr:{
state:{old:1,new:2},
begin:{old:1320981071,new:1320981072},
name:{old:"lee",new:"shark"},
}

这里看到,我们并没有记录字段的注释、类型。糟糕,我们还需要解析这一串json字段的意思给管理者。总不能直接解析:

1
2
修改了state,新值为1,旧值为2。
修改了begin,新增为1320981071,旧值为1320981072。

而正确的,应该为:

1
2
修改了状态,新值为禁用,旧值为启用
修改了开始时间,新值为2011-11-11 11:11:11,旧值为2011-11-11 11:11:12

利用数据的注释
由于在保存差异集的时候,并没有保存字段注释,类型。所有为了完整的暂时日志信息,我们需要充分地利用数据库注释。

待续……

罐头很懒 (⊙v⊙)<br><br>工作日日常 :<br>do {<br>&nbsp;&nbsp;打代码<br>} while ( 发呆 || 吃饭 )<br><br>周末日常 :<br>( 鱼罐头 || 午餐肉 || 炸鸡块 ) +<br>( 罐可乐 || 瓶啤酒 ) +<br>( 盒仔饭 || 艇仔粥 || 即食面 ) +<br>( 轻音乐 || 肥皂剧 || 热网综 ) +<br>( 水果糖 || 甜布丁 )