通用组件系统设计之日志系统
- 格式:doc
- 大小:404.00 KB
- 文档页数:14
ELK日志分析系统一、ELK日志分析系统介绍1.1传统的日志统计与分析方式日志主要包括系统日志、应用程序日志和安全日志。
系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误与错误发生的原因。
经常分析日志可以了解服务器的负荷,性能安全性,从而与时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。
如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。
这样是不是感觉很繁琐和效率低下。
当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
1.2 ELK介绍开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。
(1)、Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
(2)、Logstash是一个完全开源的工具,可以对日志进行收集、过滤,并将其存储供以后使用(如:搜索)。
(3)、Kibana 也是一个开源和免费的可视化工具,可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
1.2.1 Elasticsearch介绍Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,Lucene是当前行业最先进、性能最好的、功能最全的搜索引擎库。
但Lucene只是一个库。
无法直接使用,必须使用Java作为开发语言并将其直接集成到应用中才可以使用,而且Lucene非常复杂,需要提前深入了解检索的相关知识才能理解它是如何工作的。
浅谈管理系统操作⽇志设计(附操作⽇志类) 管理系统的操作⽇志如何做成通⽤的模块⼀直是个让我头疼的问题,不过看了博客园⾥的某篇⽂章后,现在基本解决了。
相关⽂章链接:《》 在开始做之前,必须把两个⽇志分清楚,那就是普通操作⽇志和业务操作⽇志,这两者有何区别? 在我理解,普通操作⽇志就是单表的操作记录,⽽业务操作⽇志则就是⼀系列的普通操作⽇志的集合。
打个⽐⽅,⽤户需要购买⼀样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是⼀系列的业务,如: ⽣成订单 → ⽣成商品快照 → 发送⼀条站内信 → 删除购物车⾥对应宝贝 这样⼀个下单操作就包含了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]].'"'));}}} 使⽤前,需要引⼊数据库操作类,这是我之前写的⼀份,可参考《》。
系统操作日志设计随着信息技术的发展,越来越多的企业和组织开始依赖计算机系统进行运营和管理。
在这个过程中,系统操作日志的重要性不言而喻。
系统操作日志是记录系统运行过程中的各种操作和事件的重要工具,它不仅可以帮助管理员了解系统的运行状态,还可以作为重要的安全保障措施。
在本文中,我们将探讨系统操作日志的设计原则以及如何优化系统操作日志的收集和分析。
针对系统操作日志的设计,我们需要考虑以下几个原则。
为了优化系统操作日志的收集和分析,我们可以采用一些技术手段。
首先,可以使用日志收集工具来自动收集系统的操作日志。
这些工具可以通过配置文件或API接口与系统集成,实现对系统操作日志的实时收集。
其次,可以使用日志分析工具来对操作日志进行分析和挖掘。
这些工具可以通过搜索、过滤和统计等功能,帮助管理员快速定位和解决系统中的问题。
此外,可以使用可视化工具将操作日志以图表或报表的形式展示出来,帮助管理员更直观地了解系统的运行情况和趋势。
除了技术手段,我们还需要注意系统操作日志的安全性和保密性。
系统操作日志包含了系统运行的各种细节和敏感信息,如果落入恶意攻击者的手中,可能会导致严重的安全问题。
因此,我们需要对操作日志进行加密和访问控制,确保只有授权的人员才能查看和修改操作日志。
此外,还应该建立完善的审计机制,对操作日志的修改和访问进行监控和记录,以便发现和追究违规行为。
在实际应用中,系统操作日志的设计和使用应该根据具体的需求和情况进行调整。
不同的系统可能有不同的操作日志需求,比如一些关键系统可能需要更详细的操作日志记录,而一些普通系统则可以采用较简单的日志记录方式。
此外,操作日志的分析和运用也需要根据具体的目标和需求进行调整,比如一些系统可能更关注异常事件的发现和处理,而一些系统则更关注系统性能和用户行为的分析。
系统操作日志的设计是建立在对系统运行状态和安全保障的需求之上的。
通过合理的设计和优化,可以帮助管理员更好地了解系统的运行情况,及时发现和解决问题,提高系统的稳定性和安全性。
通用组件系统设计之日志系统1.文档历史
2.系统概述
针对目前从运维侧看到的一些问题(文件过大,打印信息缺乏标准),希望对日志系统进行规范。
提供统一的API,定义一定的规则,并为有效支撑后续日志系统的发展提供支撑。
2.1.功能定义
日志的主要作用是用来还原现场,协助我们分析问题,帮助重现历史。
在日常具体工作
中,用得最多的是协助我们直接定义问题的系统维护类日志,以及用来统计分析系统的运行状态的数据上报类日志。
我们的日志未来也要具备这类能力。
2.1.1.系统维护类日志
系统维护类日志界别的分类如下。
为了辅助我们回溯相关问题,考虑到多个模块、多机器、多进程、多线程的问题,对日志进行区分,并设定一些参考格式,便于日志检索,如下供开发人员参考。
2.1.2.数据上报类日志
数据上报类日志严格遵从制定的格式,便于分析汇总。
如下是以调用者身份上报被调用服务使用状态的日志格式。
每一项之间用|分割,供参考。
2.2.性能定义
后端日志应该统一规范,通过API达成共识,并实现易用性。
并发保持不交叉,写入能力应该发挥系统能力,并不再并发时降低。
日志的格式应该统一。
验收办法,如下表:
编号并发用例场景完成时长(ms)检查
1 1线程单线程打印1000万行日志
2 10线程每线程打印100万行日志
3 10进程每进程打印100万行日志
每线程打印10万行日志
4 100线
程
5 100进
每线程打印10万行日志
程
2.3.系统设计
日志整体如下图,
编号模块职责
1 日志API 按统一规范打印日志,确保单台节点并发不乱,性能高
2 系统维护日志应用借助日志API输出的日志文件,用于系统维护
3 数据上报日志应用借助日志API输出的日志文件,用于数据上报
4 日志AGENT 在单台节点上,处理并上报结果到队列
1.对数据上报日志进行汇总处理,并形成结果
2.对系统维护日志践行检查预处理,并形成结果
5 日志收集队列Kafuka,用来汇总分散的日志
6 日志分析服务器从队列获取单节点日志结果,形成最终日志结果,输出到日
志仓库
7 日志仓库按制定格式存放日志,并建立索引
8 模块间调用门户呈现模块健康状态,供管理参考
9 集中日志呈现门户集中检索日志,供定位分析问题
2.4.门户UI参考
2.4.1.集中日志呈现门户
输入日志文件名,或者模块名,日期范围,给出所有日志列表。
2.4.2.模块间调用门户
用来描述系统间调用健康状态,同样也可以用来表达掉级的2.4.2.1.查询指定服务间调用情况
2.4.2.2.查看调用者依赖的被调使用情况
2.4.2.
3.查看按返回码和服务节点分布的情况
2.4.2.4.系统调用关系图
3.建设范围
编号内容备注
1 一期搞定日志API,解决系统维护日志的输出问题
4.系统设计
日志库功能设计要点
1.日志通用组件满足的需求。
1.C++和PHP统一日志目录和格式规范。
2.依据IP/服务名称/上下文编号,聚合和追溯日志。
3.记录服务接口,请求返回数据,正确性,响应时间等信息。
4.记录调用方,请求返回数据,正确性,响应时间等信息。
2.日志库的未来架构图。
1.规划设计图
3.日志库概要设计。
1.日志级别
1.所有级别的日志输出到同一个日志文件中;
2.DEBUG(开发人员调试日志)/INFO(业务流程日志)
/WARN(警告信息日志)/ERROR(系统错误日志);
3.ERROR级别日志,属于严重错误,需要开发人员及时处理,
反映系统服务质量和稳定性的重要指标;
2.定义通用返回码
3.接口调用方日志记录
1.log_client_req(客户端请求接口数据)
2.log_client_rsp(客户端请求后返回数据)
4.接口服务方日志记录
1.log_server_req(服务端接收请求数据)
2.log_server_rsp(服务端返回请求数据)
4.开发阶段分解和本期实现内容。
1.日志基础组件库开发(C++\PHP统一调用)(一期,本期实现)
2.日志分析上报和聚合(统一查询多台服务器日志,区分
IP/hostname)(二期)
1.日志分析统计运行质量(接口调用次数,正确率,响应时间等)(三
期)
日志库目录结构设计
•自动读取etc目录下的所有xml配置文件,xml文件以业务系统模块划分,新增的xml文件,在重启服务后,可以自动生成写日志文件。
•xml配置文件起到,服务日志先注册后使用。
•日志文件采用,日期自动更换回滚的写入方式。
接口通用返回码
返回码类型返回码编码返回码说明
成功0 调用成功
请求方错误1xxx 请求方错误
1001 请求参数字段缺失
1002 请求参数字段类型错误
1003 请求参数字段为空
1004 请求接口未找到
1005 请求接口报文格式解析错误
1006 请求接口版本号错误
1007 请求接口报文头字段错误
11xx 业务处理错误码
日志基础库开发方式:
C++和log4cplus开发,PHP扩展库,生成C++和PHP的so库文件。
感谢下载!
欢迎您的下载,资料仅供参考。