背景

大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下。考虑到最近在自学 ASP.NET Core 的相关开发,对 Serilog 这个日志记录库使用较多,好奇其内部的实现原理,趁着这段咸鱼时间好好地研究了下 Serilog 的源码,顺带复习了一些常用的设计模式。目前计划写成一个系列介绍 Serilog 的实现,如有错误还请指正。

日志记录

在分析源码前,我们首先要知道 Serilog 是什么,它的功能是什么,能做什么事。俗话说知己知彼,百战不殆。对对方都完全不了解,更别说去分析内部机理了。按照其官方定义,Serilog 是一个结构化的日志记录器。那么,首先,日志是什么?

日志,按照维基百科的说法,就是记录了在系统运行期间发生的事件,以便于了解系统活动和诊断问题。换句话来说,日志信息揭露了部分的软件运行流程。如果日志记录使用得当的话,它甚至还可以记录当时日志所处的上下文信息,为未来系统分析提供了方便。举个例子,用户在登录系统时,如果在登录流程对登录事件进行合适记录的话,我们在后期维护或者检索时就可以知晓曾经有某个用户尝试登录该系统以及是否登录成功。

// 伪代码
登录流程
{
记录日志:尝试登录
判断验证码是否正确;
记录日志:验证码正确/错误(返回);
尝试连接用户数据库;
记录日志:用户数据库连接成功/失败(返回);
查找用户名和密码匹配情况;
记录日志:用户密码验证成功/失败(返回);
检测用户权限;
记录日志:用户登录成功/失败;
}

上面是用户登录过程的伪代码,我们通过安插几条日志记录语句来记录该登录流程的具体走向。比如说我们发现有一个用户始终登录失败,通过查询其日志的记录信息可以快速得知它在哪个过程出现了错误。这里如果记录用户登录失败这条语句,就可能表明该用户的用户名和密码没有问题,但是没有足够的权限登录该系统。

那么,何为结构化日志呢?在以往的日志记录中,向日志记录器中只需要将日志消息(log message)字符串传入,由记录器向各目的地写入对应的字符串即可。然而,这样的操作有其不方便性,日志信息的格式由调用方控制,没有统一的日志记录格式,此外,数据被写死在日志字符串中,不利于通过根据数据去查询对应的日志信息(常利用正则去查询匹配字符串的日志),缺乏灵活性。结构化的日志是采用某种格式来记录日志而非原始的文本字符串信息,比如说Json、xml格式等,这种方法处理的好处在于具有更加灵活的格式控制以及查询方法等。结构化日志通常是包含日志的文本和数据,二者共同组成日志事件(log event),一次日志记录产生一个日志事件,而日志事件如何渲染成日志,由具体的日志实现所决定。

思路

虽然说这篇博客的标题叫做 Serilog 源码解析,但是一上来就直接说 xxx 类做了什么、xxx 类担任了什么职责容易让别人一头雾水,在对功能都未清晰的情况下,直接拆解源码会让未接触过的人更加难以理解。因此,本系列并不打算一上来就对源码做拆解。

这里,计划通过以一个小 demo 为开头,通过提需求的方式不断改进 demo 来作为开篇。这样做的好处有两个,一个是能够了解日志记录的核心功能有哪些,另一个是通过demo为后续的源码分析提供了基础,快速理解类库中的核心功能的实现逻辑。

这里放出了 demo 的源码。源码采用git来管理,并为不同版本添加了 tag,每个版本使用 v[num] 的形式,比如说v2版本就是 v2。只要用以下命令就可以查看不同版本的源码。

git clone https://github.com/iskcal/LogDemo
git checkout v[num]

之后,介绍下 Serilog 常用的使用方法以及源码相关的准备工作,为后续的解析做铺垫。最后,剩余部分的内容将按照 Serilog 的功能对源码进行拆解。

目录

未完待续……

总结

目前,Serilog 是一个非常广泛应用在各种项目系统中的日志类库。Serilog 具有非常强的扩展性,它并没有将所有功能全部放在Serilog这一个项目中而使得项目变得臃肿,相反,它通过将各种功能以扩展的形式分散成若干小项目,彼此单独演化,不仅保持了最核心部分功能的稳定,也保证了使用时最小包大小的效果。从Serilog组织所维护的项目中可以发现,围绕Serilog有60多子项目。在下一篇文章中,我会通过一个 demo 来展示下 Serilog 中最为核心的部分设计。

Serilog 源码解析——总览的更多相关文章

  1. Serilog源码解析——使用方法

    在上两篇文章(链接1和链接2)中,我们通过一个简易 demo 了解到了一个简单的日志记录类库所需要的功能,即一条日志有哪些数据,以及如何通过一次记录的方式将同一条日志消息记录到多个日志媒介中.在本文中 ...

  2. Serilog 源码解析——解析字符串模板

    大家好啊,上一篇中我们谈到 Serilog 是如何决定日志记录的目的地的,那么从这篇开始,我们着重于 Serilog 是向 Sinks 中记录什么的,这个大功能比较复杂,我尝试再将其再拆分成几个小块方 ...

  3. Serilog 源码解析——数据的保存(上)

    在上一篇中,我们主要研究了Serilog是如何解析字符串模板的,它只是单独对字符串模板的处理,对于日志记录时所附带的数据没有做任何的操作.在本篇中,我们着重研究日志数据的存储方式.(系列目录) 本篇所 ...

  4. Serilog 源码解析——数据的保存(下)

    上一篇中,我们提到了日志数据是如何进行解析了.然而,Serilog 灵活采用了不同的策略(Policy)决定一个日志对象如何解析到LogEventPropertyValue的子类对象中,即采用了ISc ...

  5. Serilog 源码解析——Sink 的实现

    在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) ...

  6. Serilog 源码解析——数据的保存(中)

    上一篇文章中揭露了日志数据的绑定逻辑,主要说明了日志数据绑定的结果信息,即EventProperty结构体和LogEventProperty类,以及日志数据与具名属性Token的绑定类Property ...

  7. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  8. Sentinel源码解析一(流程总览)

    引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简 ...

  9. Sentinel源码解析四(流控策略和流控效果)

    引言 在分析Sentinel的上一篇文章中,我们知道了它是基于滑动窗口做的流量统计,那么在当我们能够根据流量统计算法拿到流量的实时数据后,下一步要做的事情自然就是基于这些数据做流控.在介绍Sentin ...

随机推荐

  1. vscode写latex的正反向搜索问题

    vscode写latex的正反向搜索问题 vscode使用LaTeX Workshop + TexLive时可以很舒畅的写作 但是在长篇写作时,会涉及到正反向搜索的需求.即根据源码搜pdf的位置,和根 ...

  2. RESTful API 编写规范

    RESTful API 编写规范 在一个RESTful系统里,客户端向服务端发起索取资源的操作只能通过HTTP协议语义来进行交互.最常用的HTTP协议语义有以下5个: GET GET:发送一条或者多条 ...

  3. Oracle12c 使用总结

    /*创建临时表空间 */create temporary tablespace BBB tempfile 'D:\APP\oracle\oradata\orcl\BBB.dbf' size 500m ...

  4. 什么是64位和32位internet explorer

    什么是64位和32位internet explorer 如果您使用 64 位版本的 Internet Explorer 时,您会遇到问题,请尝试使用 32 位版本的 Internet Explorer ...

  5. aptitude命令

    命令 作用 aptitude update 更新可用的包列表 aptitude upgrade 升级可用的包 aptitude dist-upgrade 将系统升级到新的发行版 aptitude in ...

  6. [C#.NET 拾遗补漏]09:数据标注与数据校验

    数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...

  7. 使用css实现轮播图

    使用css3实现图片轮播 前言:实现图片轮播的方式有很多种 ,例如js ,css 等等. 本文主要讲述使用纯css3实现轮播图 工具介绍: 使用的编辑器: Hbuilder 进入正题 html代码: ...

  8. Rust之路(3)——数据类型 下篇

    [未经书面同意,严禁转载] -- 2020-10-14 -- 架构是道,数据是术.道可道,非常道:术不名,不成术!道无常形,术却可循规. 学习与分析数据类型,最基本的方法就是搞清楚其存储原理,变量和对 ...

  9. day31 Pyhton 总结

    # 什么是封装?     # 广义上(大家认为的) :         # 把一类事务的相同的行为和属性归到一个类中 # class Dog: #     def bite(self):pass    ...

  10. CentOS 7操作系统基础优化介绍

    01 前言 操作系统部署完毕后,需要做一些基础的简单优化操作,可以为系统未来的使用过程带来更多便捷. 02 操作系统安全优化配置 系统安装完毕后,默认系统中会存在两个重要的安全服务程序,建议将其首先进 ...