真正通用的操作日志系统设计

合集下载

基于安全文档管理的日志系统设计

基于安全文档管理的日志系统设计

技 术被 广 泛 应用 于 电子 商务 、金融 、政 治 等领 域 ,
成 为保 护 个人 隐 私 的重 要技 术 手段 。在 安 全领 域 , 数 字 签 名 保 证 了数 据 的 完 整 性 、不 可 抵 赖 性 ,而
Ci tima ae n、Cl nMesg lnFl ngmet i t sa e和 C in一 e e e l t e
Cle t m i in Re n
图 1 用 户 操 作 功 能 切 换 图
收稿日期:2 1 - 9 0 0 1 0— 3 作者简介:苏恒阳 (9 1 17 一),男,广东新兴人 ,实验师 ,研究方向为计算机网络、数据库技术和信息安全等。 [ 0 1 第3 卷 18 3 第1 期 2 1 — 2 下 ) 2 01 1 (
功 能 。 用 户通 过 点 击 不 同的 链 接可 以选 择 不 同 的 功能。 121用 户信息管理功能 __
1用 模 的 计 户 块 设
用 户 通 过 注 册 建 立 自 己的 个 人 信 息 ,登 录 以

后可 以通 过 用 户 管 理 ,进 行 用 户 信 息 的 修 改 。 用
个 信 管 文 理l 消 管 备 录 理I 人 息 理l 件管 息 理 忘 管
1 r ◆
密码 登入 系统 ,在 登录 视 图填 写 登录 信 息 , 把 登 入请 求提 交 给 登 录控 制 器 ,控 制 器 调 用 Daatr tSoe验证 信 息 ,并把 验 证 的 结果 返
回 给 用 户 ,验 证 通 过 则 进 入 系 统 ,验 证 失 败 则提 示失 败信 息。
Cl nt e s g me t i M sa e n e
L gn s视 图 o i.p j

浅谈管理系统操作日志设计(附操作日志类)

浅谈管理系统操作日志设计(附操作日志类)

浅谈管理系统操作⽇志设计(附操作⽇志类) 管理系统的操作⽇志如何做成通⽤的模块⼀直是个让我头疼的问题,不过看了博客园⾥的某篇⽂章后,现在基本解决了。

相关⽂章链接:《》 在开始做之前,必须把两个⽇志分清楚,那就是普通操作⽇志和业务操作⽇志,这两者有何区别? 在我理解,普通操作⽇志就是单表的操作记录,⽽业务操作⽇志则就是⼀系列的普通操作⽇志的集合。

打个⽐⽅,⽤户需要购买⼀样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是⼀系列的业务,如: ⽣成订单 → ⽣成商品快照 → 发送⼀条站内信 → 删除购物车⾥对应宝贝 这样⼀个下单操作就包含了4部分,可以把这4部分看成是4张表,分别对这4张表进⾏对应的操作,就实现了业务。

但今天我要讲的不是业务操作⽇志,因为不同项⽬的业务不尽相同,所以它⽆法做成通⽤模块,⽽我要讲的,就是普通操作⽇志。

上⾯解释了⼀⼤段,下⾯⼲货就要亮相了,先洗把脸清醒下。

…… ⾸先,哪些地⽅需要记录操作⽇志?执⾏insert、update、delete这3个操作的时候,就需要进⾏⽇志,⽽⽇志执⾏的先后顺序如下insert在insert后执⾏update在update前后都要执⾏,操作前获取操作前数据,操作后获取操作后数据delete在delete前执⾏ 顺序清楚后,就来看下我写的⼀份⽇志操作类吧,第⼀版随便写写的,重复代码有点多,还未来得及优化。

class LOG{protected $primaryid;protected $tbid;protected $tbname;protected $keys;protected $values;/*** 参数说明* int $tbid 查询指定表的id* string $tbname 数据库表名*/public function insert($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 1','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询字段注释$db->query('show full columns from '.$tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询所有字段信息,插⼊⽇志从表$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);for($i = 0; $i < count($keys); $i++){$db->insert(0, 0, 'tb_log_content', array('logid = '.$returnid,'tbkey = "'.$keys[$i].'"','tbvalue = "'.$values[$i].'"','comment = "'.$commentArray[$keys[$i]].'"'));}}public function updateStart($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 2','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询修改前数据信息$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);$this->primaryid = $returnid;$this->tbid = $tbid;$this->tbname = $tbname;$this->keys = $keys;$this->values = $values;}public function updateEnd(){global $db;//查询字段注释$db->query('show full columns from '.$this->tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询修改后数据信息$rs = $db->select(0, 1, $this->tbname, '*', 'and tbid = '.$this->tbid); $currentvalues = array_values($rs);//前后信息进⾏⽐较for($i = 0; $i < count($currentvalues); $i++){if($this->values[$i] !== $currentvalues[$i]){$db->insert(0, 0, 'tb_log_content', array('logid = '.$this->primaryid,'tbkey = "'.$this->keys[$i].'"','tbvalue = "'.$this->values[$i].'"','currenttbvalue = "'.$currentvalues[$i].'"','comment = "'.$commentArray[$this->keys[$i]].'"'));}}}public function delete($tbid, $tbname){global $db;//查询表注释$db->query('show table status where name = "'.$tbname.'"');$tb = $db->fetch();//插⼊⽇志主表$returnid = $db->insert(0, 2, 'tb_log', array('adminid = '.$_SESSION['admin']['id'],'type = 3','tableid = '.$tbid,'tablename = "'.$tbname.'"','comment = "'.$tb['Comment'].'"','dt = now()'));//查询字段注释$db->query('show full columns from '.$tbname);$tb = $db->fetchAll();foreach($tb as $v){$commentArray[$v['Field']] = $v['Comment'];}//查询所有字段信息,插⼊⽇志从表$rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);$keys = array_keys($rs);$values = array_values($rs);for($i = 0; $i < count($keys); $i++){$db->insert(0, 0, 'tb_log_content', array('logid = '.$returnid,'tbkey = "'.$keys[$i].'"','tbvalue = "'.$values[$i].'"','comment = "'.$commentArray[$keys[$i]].'"'));}}} 使⽤前,需要引⼊数据库操作类,这是我之前写的⼀份,可参考《》。

课程设计日志100篇通用版

课程设计日志100篇通用版

课程设计日志100篇通用版1经过一个学期的学习,我对C语言有了必须的了解。

C语言是学习计算机科学的基础,作为一名计算机专业学生,掌握C语言更是毋庸置疑。

在上课之前,就经常听同学说,C语言很难学,确实,刚开始听课时觉得老师不知所云。

但是,发现对后续资料的预习后,前面的疑团都迎刃而解,这让我对C语言的学习更有信心。

计算机最重要的就是上机操作,自己编写程序,在VisualC++运行,刚开始经常会出现错误,经过分析改正后,最后能够运行了,就觉得个性激动。

课程设计是一个把需求分析、程序编写、程序调试、撰写报告结合为一体的过程。

在这个过程中,不仅仅锻炼了我们缜密的思维和坚持不解的毅力,更磨练了一个队伍的团结互助的精神。

只有透过大家一齐努力才能将课程设计的所有环节都顺利的完成。

另外程序设计中我们遇到问题并解决问题的过程,使得我们独自探索并解决问题的潜力了有了一个提高,这有利于我们以后的学习。

同时这整一个过程,也使我们对程序编写的整个过程有了一个统筹全局的思想,因为需求分析、程序编写、程序调试、撰写报告这些过程是环环相扣的,绝对不可能独立进行。

课程设计是学习《C程序设计》后对知识的全面测试,刚拿到题目时不明白怎样去处理,觉得很复杂,经过和小组成员的讨论,上网查资料,逐个问题逐个击破,问题不再那么复杂。

透过课程设计,我发现自己还存在很多知识漏洞,编写程序时,经常会出现低级错误,很多知识点都不熟悉。

在今后的时间里,我必须要投入更多精力学习C语言,以课本为基础,请教老师,与同学讨论,参考资料,上机操作,我相信我必须能把C语言学好。

2整个设计透过了软件和硬件上的调试。

我想这对于自己以后的学习和工作都会有很大的帮忙。

在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有必须的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。

一切问题务必要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。

毕业设计日志范文(5篇)毕业设计日志100篇通用

毕业设计日志范文(5篇)毕业设计日志100篇通用

毕业设计日志范文(5篇)毕业设计日志100篇通用1、7月20日星期四生产实习的日子终于开始了,我一直都在盼着它快点到来,在学校学习的理论知识如果不能结合实践去理解,考试考再高的分数都是没用的,那根本不能说明什么,所以我想利用这次生产实习,多学点在学校里学不到的东西,让理论结合实际,加深我对土木工程专业的理解,也有助于以后的专业课的学习和掌握。

我选择了设计院作为实习地点,这主要是根据我个人的发展方向来决定的,而且在设计院里除了可以了解建筑和结构设计方面的工作,还有机会下工地了解施工方面的知识。

2、7月21日星期五进设计院实习可不是一件容易的事,这样一件复杂而有难度的事在日记里就不多说了。

终于,我进了一家私人承包的设计院,这里只有八个人,设计院虽然不大,但听说接下的工程还不少呢,每个人都有一台电脑,和我原先想的差不多。

很幸运的是,我刚来就有地方坐,还有台电脑用,(后来听同事说,这里才走了一个搞结构的女孩子,也是建工毕业的,考取了苏州一所大学的研究生)正好我可以在这里lianxicad制图,老师说过毕业设计的时候要用到,从事设计这方面的工作也是必须要会使用这个制图软件的,但学校却没有开设这门课,我很是奇怪,有时间奇怪还不如抓紧时间自学呢,我从图书馆借了一本cad教程,想利用暑假好好研究研究,现在看来,选择设计院实习真是太明智了,有那么多老师可以问,学起来一定比在家里一个人摸索要快多了!3、7月22日星期六昨天真是高兴的太早了,我的这台电脑老的真要掉牙了,速度慢就不说了,最不能容忍的就是死机,这边我才刚进入程序,那边鼠标箭头就像给万能胶粘住了一样,动弹不得,只能重新启动,这时候有一个问题出现了,重启按键的弹簧应该是不行了,键按下去就再也弹不回来了,逼得我不得不体罚这台主机,对其大打出手,拍拍、打打、弹弹,迫使它在外力作用下回弹出来,一小时死机三回都算客气的了,渐渐的我也掌握了重启的技巧,现在死机对于我来说已经是小case了除了麻烦点外,也没什么,我正好可以利用它重启的时间小小的休息一下,长时间的面对电脑对身体和眼睛都不好,这也是长期从事设计工作的弊端啊!4、7月23日星期天今天星期天,可以不用上班了,早上睡到自然醒。

网络操作系统习题答案

网络操作系统习题答案

⽹络操作系统习题答案Server 2003 ⽹络操作系统习题答案第1章⽹络操作系统导论⼀、填空题1.⽤户、⽹络⽤户2.源主机⽬标主机3.客户/服务器(C/S)⼆、简答题1.⽹络操作系统有哪些基本的功能与特性?⽹络操作系统应具有下⾯⼏个⽅⾯的功能。

(1)共享资源管理。

(2)⽹络通信。

(3)⽹络服务。

(4)⽹络管理。

(5)互操作能⼒。

⽹络操作系统的主要任务是对全⽹资源进⾏管理,实现资源共享和计算机间的通信与同步,下⾯介绍⼀些⽹络操作系统的特性。

(1)客户/服务器模式。

(2)32位操作系统。

(3)抢先式多任务。

(4)⽀持多种⽂件系统。

(5)Internet⽀持。

(6)并⾏性。

(7)开放性。

(8)可移植性。

(9)⾼可靠性。

(10)安全性。

(11)容错性。

(12)图形化界⾯(GUI)。

2.常⽤的⽹络操作系统有哪⼏种?各⾃的特点是什么?⽹络操作系统是⽤于⽹络管理的核⼼软件,⽬前得到⼴泛应⽤的⽹络操作系统有UNIX、Linux、NetWare、Windows NT Server、Windows 2000 Server和Windows Server 2003等。

(1)UNIX操作系统是⼀个通⽤的、交互作⽤的分时系统,其主要特性如下:1)模块化的系统设计。

2)逻辑化⽂件系统。

3)开放式系统:遵循国际标准。

4)优秀的⽹络功能:其定义的TCP/IP协议已成为Internet的⽹络协议标准。

5)优秀的安全性:其设计有多级别、完整的安全性能,UNIX很少被病毒侵扰。

6)良好的移植性。

7)可以在任何档次的计算机上使⽤,UNIX可以运⾏在笔记本电脑到超级计算机上。

(2)Linux是⼀种在PC上执⾏的、类似UNIX的操作系统。

1)完全遵循POSLX标准。

2)真正的多任务、多⽤户系统。

3)可运⾏于多种硬件平台。

4)对硬件要求较低。

5)有⼴泛的应⽤程序⽀持。

6)设备独⽴性。

7)安全性。

8)良好的可移植性。

9)具有庞⼤且素质较⾼的⽤户群。

角色权限表设计

角色权限表设计

用户·角色·权限·表一.引言因为做过的一些系统的权限管理的功能虽然在逐步完善,但总有些不尽人意的地方,总想抽个时间来更好的思考一下权限系统的设计。

权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新对系统的权限进行设计,以满足不同系统用户的需求,将会浪费我们不少宝贵时间,所以花时间来设计一个相对通用的权限系统是很有意义的。

二.设计目标设计一个灵活、通用、方便的权限管理系统。

在这个系统中,我们需要对系统的所有资源进行权限控制,那么系统中的资源包括哪些呢?我们可以把这些资源简单概括为静态资源(功能操作、数据列)和动态资源(数据),也分别称为对象资源和数据资源,后者是我们在系统设计与实现中的叫法。

系统的目标就是对应用系统的所有对象资源和数据资源进行权限控制,比如应用系统的功能菜单、各个界面的按钮、数据显示的列以及各种行级数据进行权限的操控。

三.相关对象及其关系大概理清了一下权限系统的相关概念,如下所示:1. 权限系统的所有权限信息。

权限具有上下级关系,是一个树状的结构。

下面来看一个例子系统管理用户管理查看用户新增用户修改用户删除用户对于上面的每个权限,又存在两种情况,一个是只是可访问,另一种是可授权,例如对于“查看用户”这个权限,如果用户只被授予“可访问”,那么他就不能将他所具有的这个权限分配给其他人。

2. 用户应用系统的具体操作者,用户可以自己拥有权限信息,可以归属于0~n个角色,可属于0~n个组。

他的权限集是自身具有的权限、所属的各角色具有的权限、所属的各组具有的权限的合集。

它与权限、角色、组之间的关系都是n对n的关系。

3. 角色为了对许多拥有相似权限的用户进行分类管理,定义了角色的概念,例如系统管理员、管理员、用户、访客等角色。

角色具有上下级关系,可以形成树状视图,父级角色的权限是自身及它的所有子角色的权限的综合。

父级角色的用户、父级角色的组同理可推。

通用范文(正式版)概要设计(软件工程文档模板)

通用范文(正式版)概要设计(软件工程文档模板)

概要设计 (软件工程)1. 引言本文档为软件工程项目的概要设计文档,旨在为项目的开发人员提供一个整体的系统设计概览。

在项目开发过程中,概要设计起到了桥梁的作用,将需求分析和详细设计阶段进行衔接。

本文档将详细描述系统的整体结构、主要模块和关键功能,并提供相应的设计原则。

2. 系统结构设计2.1 参与角色是本系统中涉及到的主要参与角色:系统管理员:负责系统的配置、用户管理和权限控制。

普通用户:包括注册用户和匿名用户,使用系统提供的功能进行操作和查询。

数据库管理员:负责数据库的管理、备份和维护。

2.2 系统组成本系统由几个主要模块组成:用户管理模块:负责用户注册、登录和信息维护等功能。

权限控制模块:实现对用户访问权限的管理和控制。

数据管理模块:负责对数据的增删改查等操作。

报表模块:根据用户的需求相应的报表和统计数据。

安全管理模块:对系统进行安全性控制和防护。

2.3 系统架构设计本系统采用分层架构的设计方式,主要包括几个层级:用户界面层:负责与用户交互和展示信息。

应用逻辑层:负责处理用户请求,调用相应的服务和实现业务逻辑。

数据访问层:负责与数据库进行交互,实现数据的持久化和访问。

数据库层:存储系统的数据和相关信息。

3. 主要功能设计本系统的主要功能包括但不限于几个方面:用户注册和登录功能:提供用户注册和登录功能,保障系统安全性。

用户信息维护功能:允许用户修改个人信息,包括密码、头像等。

数据查询和展示功能:允许用户根据条件查询并展示相关数据。

数据编辑和添加功能:允许用户对数据进行编辑和添加操作。

报表和导出功能:根据用户需求相应的报表和统计数据,并支持导出功能。

4. 系统性能设计为了保障系统的性能和稳定性,本系统需要考虑几个方面的设计:用户并发访问的支持:针对高并发访问,需要采用合适的技术手段进行负载均衡和优化。

数据库优化:针对系统中频繁访问的表,采用合适的索引策略进行优化,提高查询和更新的效率。

缓存机制:采用合适的缓存机制,减少对后台数据库的访问,提高系统响应速度。

实习日志通用版五篇

实习日志通用版五篇

实习日志通用版五篇1.实习日志通用版篇一今天,通过在xxxx饮用水公司的参观实习,了解纯净水和矿泉水的处理过程与处理工艺,认识其在具体的运行过程存在的问题及优势,掌握所见工艺的设计思路与方法。

第一级预处理系统:采用石英沙介质过滤器,主要目的是去除原水中含有的泥沙、铁锈、胶体物质、悬浮物等颗粒在20μm以上对人体有害的物质,自动过滤系统,采用进口品牌自动控制阀,系统可以自动(手动)进行反冲洗、正冲洗等一系列操作。

保证设备的产水质量,延长设备的使用寿命。

同时设备配备有自我维护系统,降低维护费用。

第二级预处理系统:采用果壳活性炭过滤器,目的是为了去除水中的色素、异味、生化有机物、降低水的余氨值及农药污染和其他对人体有害的物质污染物。

自动过滤控制系统,采用进口品牌自动控制阀,系统可以自动(手动)进行反冲洗、正冲洗等一系列操作。

第三级预处理系统:采用优质树脂对水进行软化,主要是降低水的硬度,去除水中的钙镁离子(水垢)并可进行智能化树脂再生。

自动过滤系统,采用进口品牌自动软水器,系统可以自动(手动)进行反冲洗。

2.实习日志通用版篇二今天,通过公司各处的实习,我对各处的物业管理情况有了初步的了解。

在这一过程中,我学到了物业管理工作中的具体业务知识,丰富了所学的专业知识。

为以后正常工作的展开奠定了坚实的基础。

首先,__物业受日照整个物业管理发展的影响,几处的物业管理差不多都沿袭了旧有的管理模式。

部门分工不够明确,制度不健全,少有程序化、规范化的工作流程,大部分进行着简单粗放的的管理。

其次,由于物业管理牵扯到的问题众多,各处体制不健全,各种关系错综复杂,需要协调、处理的关系众多,使得各物业处把大量的精力放在处理各种关系上,包括处理物业处与集团公司之间的关系,物业与行政部门的关系,与有关业主之间的关系。

处理好这些关系当然有利与物业管理的发展,但当因此而忽视了内部管理与对外服务时,就难免本末倒置了。

这样就影响了物业管理的健康发展。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/** * 根据配置的日志组,查询配置的自定义属性的元数据。 * * <p/>返回的是数据库中记录的数据,如果自定义属性正在调整,可能会和{@link #queryLogs(List, String, int, int)} 返回的数据列对不上。 * * @return 返回自定义属性的元数据 Map。key 为 java 属性名,value 为用于对网友显示的 displayName。 */ public Map<String, String> queryCustomPropsMetaInfo() throws Exception ;
private Date createdTime ;
/** * 自定义属性的值。 */ private Map<String, Object> otherProps = new HashMap<String, Object>() ;
//get&set 方法
可以看到,详细的日志记录,我们只设计了 id, userId, appId, appIP, createdTime 5 个基本 属性;另外还设计了一个 otherProps 用于存储每个应用自定义的属性。 对于 LogRecord 的表结构,需要根据自定义属性决定。假设我们添加了一个应用,编号为 5,有 2 个属性 string userIP 和 float moveSpeed;则应该在数据库中创建日志记录表:
/** * * 根据配置的日志组查询日志。用户编号的属性名为 userId;日志记录时间的属性名为 createdTime, 传入查询条件的格式为:yyyy-MM-dd HH:mm:ss * * @param conditions 条件列表。每条一个条件,如:userId=1,如:title~=读书 * @param orderBy * @param pageNo * @param pageSize * * @return 如果条件不足,可能返回 null;如果条件错误,可能抛出异常。 */ public PageFlip queryLogs(List<String> conditions, String orderBy, int pageNo, int pageSize) throws Exception ;
CREATE TABLE gs_log_record_5 ( id bigint(20) NOT NULL auto_increment, userId int(11) not null, appId int(11) not null, appIP varchar(32) not null,
userIP varchar(32) not null, moveSpeed float(15,3) not null,
灵活通用的操作日志系统设计
一次写成,所有系统直接使用
作者:加伊 liukaixuan@ 欢迎关注可以在法律和道德允许的范围内,以任意方式,收费或免费,无限制的复制、分发、修改、 转载、引用本文档的部分或全部内容;你可以保留原作者和出处,也可以不保留;你可以继续使用 PDF 文 档格式,也可以转换成任意其他格式,也可以发布到其他软件或硬件平台。
/** * 根据配置的日志组,插入一条日志。 * * @param userId 操作用户 * @param customProps 日志自定义属性 */ public void insertLog(int userId, Map<String, Object> customProps) throws Exception ;
服务器端-表结构
服务器端设计 2+n 张表,gs_log_app 记录使用此服务的应用系统信息, gs_log_custom_property 记录每个应用自定义的属性。N 表是指每个应用单独创建的详细 日志记录表。 gs_log_app 表结构:
CREATE TABLE gs_log_app ( id int(11) NOT NULL auto_increment, appName varchar(64) NOT NULL, secureCode varchar(64) NOT NULL, description varchar(255), recordsCount int(11) default 0, createdTime datetime, PRIMARY KEY (id),
3 / 21
KEY idx_scode (secureCode) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
id,自增 ID,用于分表,让每个应用的日志存储在单独的表中;appName 为应用名称,用 于显示;secureCode 为接入密码,64 位随机字符串,客户端接入时使用,用于验证客户端 身份;recordsCount 为日志记录数,以后用来做同一个应用日志的分表之类的。 gs_log_custom_property 表结构:
2 / 21
通用应用日志
这里的日志是指管理操作日志,如“XXX 什么时间删除了一篇文章”等,不是程序往日志 文件输出的调试日志。调试日志已经有了很多成熟的工具,如各类 log4j,数不胜数,不再 研究。 对于操作日志, 一般都存储在数据库中以方便查询; 但由于每个系统可能记录的字段属 性不同, 一般都需要单独设计, 造成每套系统都需要单独设计一个日志模块, 增加了工作量。 通用应用日志服务是指, 通过一种足够灵活的设计方式, 使得几乎所有系统都可以直接 使用的日志模块。应用只需要少量的工作,即可把操作日志转给日志服务处理,节省日志模 块开发工作量。
1 / 21
目录
目录 ........................................................................................................................................... 2 通用应用日志 ........................................................................................................................... 3 架构设计 ................................................................................................................................... 3 服务器端-表结构.................................................................................................................. 3 客户端-API 设计 .................................................................................................................. 5 架构实现 ................................................................................................................................... 8 客户端 API 实现 .................................................................................................................. 8 服务端-API 实现 ................................................................................................................ 15 客户端使用示例 ..................................................................................................................... 20
createdTime datetime not null, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create index idx_ms on gs_log_record_5(moveSpeed) ;
每个自定义属性在数据库中按照各自的类型创建成单独的字段。 我们还给 moveSpeed 加了 索引,用于检索。
public class LogRecord {
/** * 自增 Id */ private long id ;
/** * 用户编号 */ private int userId ;
/** * 应用编号 */ private int appId ;
4 / 21
/** * 请求插入此日志的服务器 IP */ private String appIP ;
客户端-API 设计
从使用者的角度,客户端 API 越简单越好。对于自定义属性的管理和应用配置,全部 放到服务器端通过 web 方式管理。客户端 API 只提供 3 个接口,用于:插入日志,查询日 志,查询每个属性的对外显示名称。
5 / 21
接口如下:
public interface AppLogService {
CREATE TABLE gs_log_custom_property ( id int(11) NOT NULL auto_increment, appId int(11) not null, propName varchar(32) NOT NULL, colName varchar(32) NOT NULL, displayName varchar(32) NOT NULL, dataType varchar(32) NOT NULL, createdTime datetime, PRIMARY KEY (id),
相关文档
最新文档