1引言

1.1目的

在软件使用过程中,我们的数据是否录入正确,若录入失败,会不会有相关的错误信息记录下来,方便开发员进行后期的错误查找。另外,哪个操作员登录软件的次数较多(加工资咯)?单据业务状态变化的历史记录,我们最好都要记录下来,方便我们对历史数据的分析。

1.2开发环境

采用微软Windows系统列操作系统即可,本人采用的是XP系统

1.3开发工具

Windows环境下,采用Visual Studio C#.2008开发,数据库选择SQLServer2005

1.4适用范围

适用于CS结构的软件,由于BS结构的软件很少做过,不太清楚。

2开发框架-系统日志

2.1名词解释

2.1.1单据状态

其实这个名词不需要解释,只是为了说明我的处理方式,故放在此处说明的。每张业务单据,都有它的单据状态,例:已确认、已审核、已审批等。这些状态的变更,对于某些行业软件也是比较重要的。因此,我把它也归为日志的一种:单据状态操作日志。并且我在数据库里创建了一张表,专门存放业务单据的状态变化信息。例:库存模块的入库单,它有哪些状态值,都可以进行手工维护的。

2.1.2日志类型

日志类型,我把它分为5种。

1.操作员日志,即记录某一操作员何时登录软件、何时退出软件,所使用的计算机名称、IP地址、Mac网卡地址等。

2.单据操作日志,即某个功能模块,新增了一张单据,记录下这张单据的主键字段值、生成人、生成时间等。同时,也要记录下与数据库交互的sql语法。相当于历史记录。

3.单据状态操作日志,正如前面的解释,就是记录下某一功能模块的单据状态发生的变化。例:库存模块的入库单,某条单据的状态何时由“已确认”变更为“已审核”等。

4.错误信息日志,这种日志比较重要,对于开发员的后期查询问题来说,非常关键。

5.自定义日志,比较灵活。可以手工设置对数据库某表中某字段值的变更作记录。

2.1.3保存方式

就是将日志保存在何处,基本上有2种方式,包括数据库表和文件。

2.2设计方案

2.2.1设计思路

我们根据日志类型来分别说明各类型的设计思路。

1.操作员日志,这个比较简单,就是在该操作员登录成功的时候,在日志表中插入一条记录,记录下该操作员的登录日期和时间等。在操作员正常退出的时候,再获取其退出日期和时间,这里有个小技巧,就是在日志表中如何获取该操作员登录的那条信息呢?有个比较简单的方法,就是在登录记录成功插入日志表时,记录下该条信息的主键字段值。退出时,直接对这条信息进行update操作即可。可能有人要问,要是系统非正常退出如何处理呢?退出时的状态改为非正常,记录下就可以了。

2.单据操作日志,在单据保存成功的时候,获取其主键字段值和操作员编码和操作员姓名(为何都要获取的原因是可能操作员名称会发生变化,出现的情况是某个操作员辞职闪人了,我们直接修改下操作员姓名即可,它的编码还保存)及操作时间。目前只记录数据操作(包括新增、修改、删除)成功的情况。

3.单据状态操作日志,其实是第5种情况的一个特例。这种日志处理起来要比前两个麻烦些,因为我们需要记录下单据日志的旧状态和新状态,还有主键字段值。就是单据的某条数据执行了某种功能,单据状态发生变更。我的思路是单据状态操作之前,记录下旧状态,操作之后,记录下新状态。在成功时,生成一条单据状态操作日志就可以了。

4.错误日志信息,这个日志最好保存在外部文件中,在发生错误信息时记录下哪个窗体、哪个控件、哪个方法或事件、哪行代码发生错误就行了。像log4net这种日志类库就可以搞定,大家可以研究下它。

5.自定义日志,这种方式最为复杂,原因是我们不清楚前台哪些单据(哪些表哪些字段)需要我们进行日志操作。也就是说,我们要预先设置好所有单据(或表)的日志接口。我的想法是这样的,若以后随着系统的庞大,需要对某张单据进行日志记录,我们就单独增加一个这样的类支持下就行了,毕竟这种需求比较少。

2.2.2界面设计

操作员日志如图-1所示

                                                               -1

2.2.3类图设计

2.2.4程序流程

                                                 
                                    图-2

                    
             
-3

            
                             
-4

错误信息日志就是在发生错误的时候记录,流程图略

自定义日志,流程图略

2.2.7数据结构


                       
                   
-5

系统日志

字段名称

描述

序号

主键字段,流水号

日期

登录日期,格式为yyyy-mm-dd

工作组ID

操作员所在的工作组ID

工作组名称

操作员所在的工作组名称

角色ID

操作员所在的角色ID

角色名称

操作员所在的角色名称

操作员ID

操作员ID

操作员名称

操作员名称

开始时间

系统登录时间

结束时间

系统退出时间

客户机名称

操作员所用的客户机器名称

登录用户

操作员所用的客户机器名称的登录用户

IP地址

操作员所用的客户机器的IP地址

Mac地址

操作员所用的客户机器的物理网卡地址

备注

就是备注

单据操作日志

字段名称

描述

序号

主键字段,流水号

模块ID

模块ID

主键值

功能模块的主键字段值

操作名称

操作包括新增、修改、删除等

操作员名称

操作员ID+操作员名称

操作时间

操作时间

操作结果

预留

备注

就是备注

附数据库表数据,如图-6所示



                                                               
            
                                          图
-6

单据状态

字段名称

描述

序号

主键字段,流水号

模块ID

模块ID

状态编码

单据状态编码

状态名称

单据状态名称

是否使用

是否使用,与权限无关

系统初始

是否系统初始,与权限无关

描述

描述状态的作用

备注

就是备注

单据状态操作日志

字段名称

描述

序号

主键字段,流水号

模块ID

模块ID

主键值

功能模块的主键字段值

旧状态值

旧的单据状态值

新状态值

新的单据状态值

操作员名称

操作员ID+操作员名称

操作时间

操作时间

备注

就是备注

附数据库表数据,如图-7所示


                                                        
      
                                    图
-7

2.2.8注意事项

3问题讨论

我知道net的开源控件中,有个log4net的日志类库,我最近准备研究下它。然后把结果分享给大家,不知道它支持我上述的几种日志吗?

可能大家感觉楼主这丫不厚道,连个源码都没有。。。其实真没有。。。(旁白:这个可以有,这个真没有)。是这样的,本人在写一个类库(已包括这些),因此,没有单独写个demo出来,等类库写好以后,上传给大家!

posted on 2011-07-07 22:21  爱编程的大叔  阅读(363)  评论(0)    收藏  举报