zoukankan      html  css  js  c++  java
  • 简单、方便、实用的日志记录系统

    日志对于一个系统来说是很重要的一部分,可分为系统日志和操作日志。

    系统日志一般用于记录系统中的异常,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了,大伙看看有啥意见可以提出来讨论讨论,也欢迎拍砖。

  • 相关阅读:
    线性表的顺序存储结构
    Arrays数组类使用介绍
    collection各实现类用途建议
    【转】数据结构collection接口和map接口架构图
    java 面向对象特性说明
    文件的输入输出操作IO
    sql 约束用法
    select into 在mysql中失效的替换办法
    inner join 、left join 、right join 和full join的区别
    Tomcat 启动过程
  • 原文地址:https://www.cnblogs.com/AMI-POWER/p/3788406.html
Copyright © 2011-2022 走看看