PowerDotNet平台化软件架构设计与实现系列(11):日志平台
所有后端应用几乎都会记录日志,日志系统可以统一抽象出来提供服务。
最近被Log4j2的安全漏洞刷屏了,作为开发人员的我只能咩哈哈几次表示日志处理太难了,只有折腾过的人才知道这里面的艰辛啊。
在实现PowerDotNet日志系统之前,参考调研了Flume、ELK、Scribe和kafka的日志解决方案,对比后最终选择Facebook的日志系统Scribe作为目标,实现了基于thrift协议(当然也支持http协议)无锁且异步的更高性能简洁而稳定的可扩展日志系统Power.XLogger。
本文讲讲PowerDotNet内置的日志平台系统。
环境准备
1、(必须).Net Framework4.5+
2、(必须)MySQL或SqlServer或PostgreSQL或MariaDB或MongoDB或ElasticSearch
3、(必须)PowerDotNet数据库管理平台,主要使用DBKey功能
4、(必须)PowerDotNet配置中心Power.ConfigCenter
5、(必须)PowerDotNet注册中心Power.RegistryCenter
6、(必须)PowerDotNet基础数据平台Power.BaseData
7、(必须)PowerDotNet缓存平台Power.Cache
8、(必须)PowerDotNet消息平台Power.Message
9、(必须)PowerDotNet人员管理平台Power.HCRM,后续文章详细介绍
一、Scribe简介
Scribe是Facebook开源的日志收集系统,它能够从各种日志源上收集日志,存储到一个中央存储系统(可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。
Scribe为日志的“分布式收集,统一处理”提供了一个可扩展的高容错的方案。
Scribe从各种数据源上收集数据,放到一个共享队列上,然后push到后端的中央存储系统上。
当中央存储系统出现故障时,Scribe可以暂时把日志写到本地文件中,待中央存储系统恢复性能后,Scribe把本地日志续传到中央存储系统上。

Scribe主要包括三部分,分别为Scribe Agent, Scribe和存储系统。

1、 Scribe Agent
Scribe Agent实际上是一个thrift client。 向Scribe发送数据的唯一方法是使用thrift client, Scribe内部定义了一个thrift接口,用户使用该接口将数据发送给server。
2、Scribe
Scribe接收到thrift client发送过来的数据,根据配置文件,将不同topic的数据发送给不同的对象。Scribe提供了各种各样的store,如 file, HDFS等,Scribe可将数据加载到这些store中。
3、Store
Scribe中的Store也就是我们所理解的存储系统,当前Scribe支持非常多的Store,包括:
file(文件)
buffer(双层存储,一个主储存,一个副存储)
network(另一个Scribe服务器)
bucket(包含多个 store,通过hash的将数据存到不同store中)
null(忽略数据)
thriftfile(写到一个Thrift TFileTransport文件中)
multi(把数据同时存放到不同store中)
二、日志存储
PowerDotNet的日志平台设计借鉴了Scribe,也支持从各种数据源上收集数据,放到一个共享队列上,然后push或pull到后端的中央存储系统上。
不过考虑到不同的应用场景,这个共享队列被设计成动态可配置的日志容器,容器可以是主流的几种消息队列(RabbitMQ、MSMQ、RocketMQ、Kafka等),redis,本地缓存等。
当存储系统出现故障时,PowerDotNet也会把日志“消息”暂时(序列化)写到本地文件中,待存储系统恢复性能后,再把本地日志(反序列化)续传到中央存储系统上。这种日志记录容错思想其实比较简单直白,非常容易理解。
PowerDotNet内置的日志存储媒介(也就是中央存储系统)包括MongoDB、MySQL、MariaDB、PostgreSQL、SQLServer和ElasticSearch,也给Exceptionless和ELK预留了接口,后续开发考虑把Hive也加进去,毕竟对于日志系统而言,大数据量处理和较为完善的分析工具链是极其重要的参考指标。
在创建后端应用的时候,配置中心会自动分配一个记录日志的DBKey,默认为PostgreSQL,但是个人在公司里碰到的更多的是使用MongoDB或者ElasticSearch或者ELK。

配置好DBKey,日志系统自动生效。写代码的时候调用现有的PowerDotNet记录日志方法即可。
PowerDotNet记录日志方法默认是全异步收集,不会影响业务主流程。
PowerDotNet日志组件支持敏感信息脱敏,这也是非常常见的业务需求功能。
对比Scribe的存储系统,PowerDotNet.XLogger做了大量裁剪。
三、日志管理
1、获取DBKey
因为每个应用默认都配置了一个DBKey,所以查询应用的日志时,需要通过DBKey间接找到存储,最后再将查询数据显示出来。

考虑到由于日志量通常都非常庞大,所以我们设计日志系统的时候都需要考虑分片处理。
DBKey配置日志这种方式天然就适合日志分片存储,在日志发展到一定数据量级以后,不需要运维和DBA介入,直接换个DBKey或者通过DataX数据同步平台修改DBKey连接串就可以切换新的日志存储介质,历史日志如果需要,通过其他工具直接访问,简直不要太容易。
2、日志查询
日志查询界面自动根据应用适配DBKey找到自己的日志记录。

3、调用链查询
对于调用链路复杂冗长的接口,调用链查询支持非常重要,根据个人开发运维经验,在排查线上问题的时候,调用链查询功能发挥了非常直观高效的作用。

调用链支持多系统多应用的查询,不同系统的DBKey可能不同,数据存储在不同的数据库中,这时候需要我们自己在内存中进行聚合分页展示。
有些开源的优秀组件,如zipkin或SkyWalking+SkyApm,在你的服务中埋点相应代码,可以实现分布式链路追踪系统。
调用链查询对于排查调用异状非常有帮助。
四、其他
对于日志系统而言,我们几乎不会强调ACID、CAP、BASE这些要求。日志系统应该尽可能做到快速高效不影响主业务流程,如果在保证日志高可用的同时,能不丢数据那是最好的结果。
Power.XLogger默认推荐各应用使用AOP方式记录日志,统一日志记录格式,当然为了便于排查问题,也需要在某些步骤埋点记录特定日志。
对于某些系统,日志可能非常重要,比如支付、财务、账户等系统。
如果日志是业务逻辑里非常重要的一部分,尤其关键环节的重要日志,不但业务逻辑可能要用到,而且排查追踪问题也很有用处,这种情况下,就不建议直接使用日志平台了。
PowerDotNet对于这些日志敏感系统,都会在自身系统里建立日志表进行核心关键日志记录,当然也支持按需在Power.XLogger记录日志。
对于日志系统的埋点操作,建议使用Power.XLogger的异步批量处理方法,并且显式带上超时时间,Power.XLogger记录日志默认2秒超时,默认批量处理200条数据,这两个参数可通过配置中心动态调整。
日志队列堆积到一定阈值(默认20万条,可在配置中心动态配置)自动裁剪日志,防止系统内存不足或其他原因导致崩溃。
参考:
https://github.com/facebookarchive/scribe
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
PowerDotNet平台化软件架构设计与实现系列(11):日志平台的更多相关文章
- PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台
为了复用和解耦,快速开发更多的系统和应用,我们对自己经常说的"系统"和"应用"进行更高级的提取和抽象. 十多年前入行,辗转至今,写过很多很多应用,个人喜欢分门别 ...
- PowerDotNet平台化软件架构设计与实现系列(01):基础数据平台
本系列我将主要通过图片和少许文字讲解通过个人自研的PowerDotNet进行快速开发平台化软件产品. PowerDotNet不仅仅是包含像Newtonsoft.Json.Dapper.Quartz.R ...
- PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台
为了DB复用和简化管理,我们对常见应用依赖的DB模块进行更高级的提取和抽象. 虽然一些ORM可以简化DB开发,但是我们还是需要进行改进和优化,否则应用越多,后期管理运维越混乱. 根据常见开发需要,数据 ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- PowerDotNet平台化软件架构设计与实现系列(13):应用监控平台
本文再写一篇和具体业务逻辑几乎无关的公共服务应用监控平台.PowerDotNet自研的应用监控平台系统,是服务治理的重要拼图,和服务治理平台配合使用效果更好. 监控开源产品非常丰富,站在巨人的肩膀上, ...
- PowerDotNet平台化软件架构设计与实现系列(12):HCRM人员管理平台
技术服务于业务,良好的技术设计和实现能够大幅提升业务质量和效率. PowerDotNet已经形成了自己的开发风格,很多项目已被应用于生产环境,可行性可用性可靠性都得到了生产环境验证. 编程是非常讲究动 ...
- PowerDotNet平台化软件架构设计与实现系列(06):定时任务调度平台
定时任务是后端系统开发中少不了的一个基本必备技能. 传统的实现定时任务的方式有很多种,比如直接使用操作系统的Timer和TaskSchedule,或者基于Quartz.HangFire.xxl-job ...
- PowerDotNet平台化软件架构设计与实现系列(10):文件平台
很多业务系统少不了需要进行文件管理,比如各种图片.excel.pdf.压缩包等等,为了高度可复用,我们抽象出文件平台,加强对文件进行管理. PowerDotNet文件平台目前支持阿里云OSS.Fast ...
- PowerDotNet平台化软件架构设计与实现系列(04):服务治理平台
系统和系统之间,少不了数据的互联互通.随着微服务的流行,一个系统内的不同应用进行互联互通也是常态. PowerDotNet的服务治理平台发源于早期的个人项目Power.Apix.这个项目借鉴了工作过的 ...
随机推荐
- day12 keepalived高可用
day12 keepalived高可用 一.高可用介绍 1.什么是高可用 部署在整个集群中的一个高可用软件,作用是创建一个VIP(虚拟IP),在整个集群中有且只有一个机器上生成VIP,当这台机器出现问 ...
- ceph对象存储场景
安装ceph-radosgw [root@ceph-node1 ~]# cd /etc/ceph # 这里要注意ceph的源,要和之前安装的ceph集群同一个版本 [root@ceph-node1 c ...
- MySQL索引背后的数据结构及算法原理 【转】
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- Oracle中dbms_random包详解
Oracle之DBMS_RANDOM包详解参考自:https://www.cnblogs.com/ivictor/p/4476031.html https://www.cnblogs.com/shen ...
- 数据源(Data Source
数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体.在数据源中存储了所有建立数据库连接的信息.就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数 ...
- myBatis批量添加实例
<!-- 批量添加中转地数据 --> <insert id="addBatch" parameterType="com.isoftstone. ...
- 【前端】关于DOM节点
参考这个: https://juejin.cn/post/6844903849614901261 DOM树的根节点是document对象 DOM节点类型:HTML元素节点(element nodes) ...
- JavaFile I/O流
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
- C++STL标准库学习笔记(二)二分查找
二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...
- shell脚本 微信/钉钉验证登录服务器
一.简介 登录用户需要二次验证码进行验证 可以配合 监控用户登录,发送通知给企业微信/钉钉 来使用 脚本放到/etc/profile.d/ 目录,登录的时候自动触发 二.微信脚本 1.需要修改Crop ...