所有后端应用几乎都会记录日志,日志系统可以统一抽象出来提供服务。

最近被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://flume.apache.org

https://github.com/facebookarchive/scribe

https://kafka.apache.org

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://elasticsearch.cn

https://www.elastic.co/cn/products/beats/filebeat

https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html

PowerDotNet平台化软件架构设计与实现系列(11):日志平台的更多相关文章

  1. PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台

    为了复用和解耦,快速开发更多的系统和应用,我们对自己经常说的"系统"和"应用"进行更高级的提取和抽象. 十多年前入行,辗转至今,写过很多很多应用,个人喜欢分门别 ...

  2. PowerDotNet平台化软件架构设计与实现系列(01):基础数据平台

    本系列我将主要通过图片和少许文字讲解通过个人自研的PowerDotNet进行快速开发平台化软件产品. PowerDotNet不仅仅是包含像Newtonsoft.Json.Dapper.Quartz.R ...

  3. PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台

    为了DB复用和简化管理,我们对常见应用依赖的DB模块进行更高级的提取和抽象. 虽然一些ORM可以简化DB开发,但是我们还是需要进行改进和优化,否则应用越多,后期管理运维越混乱. 根据常见开发需要,数据 ...

  4. PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台

    ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...

  5. PowerDotNet平台化软件架构设计与实现系列(13):应用监控平台

    本文再写一篇和具体业务逻辑几乎无关的公共服务应用监控平台.PowerDotNet自研的应用监控平台系统,是服务治理的重要拼图,和服务治理平台配合使用效果更好. 监控开源产品非常丰富,站在巨人的肩膀上, ...

  6. PowerDotNet平台化软件架构设计与实现系列(12):HCRM人员管理平台

    技术服务于业务,良好的技术设计和实现能够大幅提升业务质量和效率. PowerDotNet已经形成了自己的开发风格,很多项目已被应用于生产环境,可行性可用性可靠性都得到了生产环境验证. 编程是非常讲究动 ...

  7. PowerDotNet平台化软件架构设计与实现系列(06):定时任务调度平台

    定时任务是后端系统开发中少不了的一个基本必备技能. 传统的实现定时任务的方式有很多种,比如直接使用操作系统的Timer和TaskSchedule,或者基于Quartz.HangFire.xxl-job ...

  8. PowerDotNet平台化软件架构设计与实现系列(10):文件平台

    很多业务系统少不了需要进行文件管理,比如各种图片.excel.pdf.压缩包等等,为了高度可复用,我们抽象出文件平台,加强对文件进行管理. PowerDotNet文件平台目前支持阿里云OSS.Fast ...

  9. PowerDotNet平台化软件架构设计与实现系列(04):服务治理平台

    系统和系统之间,少不了数据的互联互通.随着微服务的流行,一个系统内的不同应用进行互联互通也是常态. PowerDotNet的服务治理平台发源于早期的个人项目Power.Apix.这个项目借鉴了工作过的 ...

随机推荐

  1. day12 keepalived高可用

    day12 keepalived高可用 一.高可用介绍 1.什么是高可用 部署在整个集群中的一个高可用软件,作用是创建一个VIP(虚拟IP),在整个集群中有且只有一个机器上生成VIP,当这台机器出现问 ...

  2. ceph对象存储场景

    安装ceph-radosgw [root@ceph-node1 ~]# cd /etc/ceph # 这里要注意ceph的源,要和之前安装的ceph集群同一个版本 [root@ceph-node1 c ...

  3. MySQL索引背后的数据结构及算法原理 【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. Oracle中dbms_random包详解

    Oracle之DBMS_RANDOM包详解参考自:https://www.cnblogs.com/ivictor/p/4476031.html https://www.cnblogs.com/shen ...

  5. 数据源(Data Source

    数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体.在数据源中存储了所有建立数据库连接的信息.就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数 ...

  6. myBatis批量添加实例

    <!-- 批量添加中转地数据 -->      <insert id="addBatch" parameterType="com.isoftstone. ...

  7. 【前端】关于DOM节点

    参考这个: https://juejin.cn/post/6844903849614901261 DOM树的根节点是document对象 DOM节点类型:HTML元素节点(element nodes) ...

  8. JavaFile I/O流

    Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...

  9. C++STL标准库学习笔记(二)二分查找

    二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...

  10. shell脚本 微信/钉钉验证登录服务器

    一.简介 登录用户需要二次验证码进行验证 可以配合 监控用户登录,发送通知给企业微信/钉钉 来使用 脚本放到/etc/profile.d/ 目录,登录的时候自动触发 二.微信脚本 1.需要修改Crop ...