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出来,等类库写好以后,上传给大家!
浙公网安备 33010602011771号