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

最近被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. spring boot集成swagger文档

    pom <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifa ...

  2. 3.Vue.js-目录结构

    Vue.js 目录结构 上一章节中我们使用了 npm 安装项目,我们在 IDE(Eclipse.Atom等) 中打开该目录,结构如下所示: 目录解析 目录/文件 说明 build 项目构建(webpa ...

  3. react18 来了,我 get 到...

    大家好! 本文主要是关于即将发布的 react 18 的新特性.那么 react18 带来了什么呢? 详情可以关注 github React 18 工作组仓库 1. automatic batchin ...

  4. CPU状态信息us,sy等含义

    目录 一.概述概述 二.详解 us和sy ni id wa hi和si st 三.总结 一.概述概述 比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位.那么这100个cpu时 ...

  5. java 8 启动脚本优化 3

    #!/bin/bash #链接文件 source /etc/profile #java虚拟机启动参数 #通过http://xxfox.perfma.com/jvm/check来检查参数的合理性 #各参 ...

  6. AcWing1264. 动态求连续区间和 (树状数组做法)

    1.题目 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n ...

  7. JAVA中CountDownLatch的简单示例

    public static void main(String[] args) throws InterruptedException { CountDownLatch latch =new Count ...

  8. Excel转Json升级版-Python

    Excel转Json升级版 将excel文件夹中所有xslx文件全部转换json文件,存放在data文件夹中: excel中的格式,从序号为2的行开始,2行为key:1行可以自由写注释: 使用时用双击 ...

  9. GoLang设计模式18 - 适配器模式

    说明 适配器模式是一种结构型设计模式.我们用常用的两种笔记本电脑来说明一下这种设计模式. 我们常用的笔记本无非是这两大类: Macbook Pro Windows Laptop 当前这两类笔记本常见的 ...

  10. 【LeetCode】941. Valid Mountain Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...