日志对于一个系统来说是很重要的一部分,可分为系统日志和操作日志。
系统日志一般用于记录系统中的异常,BUG,该类日志主要用于开发人员进行问题分析,定位
操作日志一般用于记录用户在系统中所做的各种操作,该类日志的用处很多,比如可以查看某个人在什么时间做了什么操作(责任追踪)、分析哪些功能模块用户使用得比较多比较感兴趣(用于优化等)、用户反馈问题时,开发人员可以根据日志中用户的操作来重现问题(这个对开发人员还是蛮有用的,亲身体验,用户经常反馈一些问题,他也不会给你详细解释是在什么情况下做什么操作的,只是说我现在遇到这个问题了;这个时间就只有去看操作日志,根据用户的操作来重现他的所遇到的问题);日志的用处就不一一列举了。
系统中的错误日志可简单的重写页面的OnError事件来进行日志的写入,一般只需要记录时间,用户,报错的详细信息也就可以了
操作日志,根据业务的需求不同,记录的日志内容也不一样;看到有些系统中的操作日志记录得比较全,但很多地方都可以看到写日志的操作;这样做的优点时:在一条日志记录中可以记录得很详细,日志内容可以根据业务的需求来描述;缺点是所有需要记录日志的地方都得手动写记录日志的代码,比较麻烦。
那么有没一种解决方案是可以不需要在系统的各个角落都去手动写日志记录的方法呢??
可以看到我们现在用到很多的平台、框架,在最终与数据库打交道的地方几乎都是集中在某一个地方,在这里会生成执行的SQL语句,既然系统中所有的执行增删改查的操作都要经过这里,那么我们可以在这里进行日志记录(一般情况下,只有对数据进行增、删、改才是需要记录日志的)。
在这里获取到一条执行SQL的语句,对该语句进行解析,可以解析出该语句是对什么表进行了什么操作,操作的字段有哪些,操作的值都是些什么值。获取到这些数据后需要怎么来记录呢??答案是根据配置文件来进行操作。
下面讲讲配置文件
先上一小段配置文件
<Table Name="Member" Desc="会员" > <Value field="cardnum">卡号:</Value> <State> <Fileds filed="type" > <Value para="1">办卡</Value> <Value para="2">充值</Value> <Value para="3">退卡</Value> <Value para="4">补卡</Value> <Value para="5">挂失</Value> <Value para="6">恢复</Value> </Fileds> <Fileds filed="invoice"> <Value para="1">开发票</Value> </Fileds> </State> </Table>
解释一下这段配置
Table:一个表,表名,对应的说明
Value:一般对应这个表的唯一键字段
State:一些特殊的字段,比如某个字段的值修改为特殊值时,代表是什么操作
再看看数据库中的日志表:
ID int 自增
LogTime datetime 时间
UserName nvarchar(50) 用户
OptType nvarchar(50) 操作类型
OptObject nvarchar(50) 操作对象
Value nvarchar(50) 操作值
有了以上这些,现在就好办了;
添加:比如一条语句是inert into Member values('0001','大神')
根据上述的SQL语句解析及配置文件的对比,我们可以得出:当前是进行添加,是添加的会员,会员的卡号是0001
这样就可以生成一条简单的日志记录了;
删除:与添加类似,但在删除之前需要先将删除的数据查询出来,不然可能会获取不到到底是删除了哪个会员
修改:稍麻烦一点,普通的删除可以简单的记录XX修改了会员0001,或者可以详细记录哪些字段由什么值修改为什么值(这样记录用户或许会看不懂,比如一些状态值,这里就需用到配置文件中的Filed了)
比如修改Member表Type字段,修改后为1则规定为办卡,2为充值等等,这时我们的日志就是XX充值会员卡,卡号是0001;
至此一个简单的日志记录系统就完成啦,下面来点最终生成的日志数据
195 2009-09-18 09:10:38.000 admin 修改密码 会员卡 卡号:000047 198 2009-09-18 10:42:29.000 admin 修改密码 会员卡 卡号:000053 337 2009-09-19 12:20:06.000 admin 修改密码 会员卡 卡号:000040 710 2009-09-22 11:49:14.000 admin 修改密码 会员卡 卡号:000026 811 2009-09-23 10:15:29.000 admin 办卡 会员卡 卡号:000062 1159 2009-09-25 21:39:38.000 admin 充值 会员卡 卡号:000005 1173 2009-09-26 09:57:00.000 admin 修改密码 会员卡 卡号:000027 1429 2009-09-27 21:38:40.000 admin 办卡 会员卡 卡号:000064 1560 2009-09-30 14:53:40.000 admin 办卡 会员卡 卡号:000063 1562 2009-09-30 15:02:54.000 admin 充值 会员卡 卡号:000063 1751 2009-10-02 16:55:09.000 admin 办卡 会员卡 卡号:000065 1908 2009-10-04 12:05:52.000 admin 办卡 会员卡 卡号:000066 1976 2009-10-04 17:36:55.000 admin 充值 会员卡 卡号:000013 2123 2009-10-06 13:04:26.000 admin 办卡 会员卡 卡号:000067 2236 2009-10-07 14:28:07.000 admin 办卡 会员卡 卡号:000068 2264 2009-10-07 16:52:44.000 admin 充值 会员卡 卡号:000028 2286 2009-10-07 17:59:58.000 admin 充值 会员卡 卡号:000049 2326 2009-10-08 11:28:40.000 admin 办卡 会员卡 卡号:000069 2553 2009-10-09 15:10:37.000 admin 办卡 会员卡 卡号:000070 2640 2009-10-09 22:26:48.000 admin 充值 会员卡 卡号:000007 2778 2009-10-11 11:34:02.000 admin 修改密码 会员卡 卡号:000017 3141 2009-10-14 11:56:43.000 admin 办卡 会员卡 卡号:000071 3170 2009-10-14 15:46:17.000 admin 办卡 会员卡 卡号:000072 3172 2009-10-14 15:46:49.000 admin 修改密码 会员卡 卡号:000072 3297 2009-10-15 17:33:28.000 admin 充值 会员卡 卡号:000014 3486 2009-10-17 15:48:16.000 admin 办卡 会员卡 卡号:000073
优点:只需要将日志记录那部分代码写好后就不需要再更改了,如果需要添加新的日志,只需要添加配置即可,方便、简单,不需要到项目的各个角落都去写日志记录的代码
缺点:日志记录的信息比较僵硬,描述不够直观;
大概就这样实现就OK了,大伙看看有啥意见可以提出来讨论讨论,也欢迎拍砖。