Serilog 源码解析——总览
背景
大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下。考虑到最近在自学 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 源码解析——总览的更多相关文章
- Serilog源码解析——使用方法
在上两篇文章(链接1和链接2)中,我们通过一个简易 demo 了解到了一个简单的日志记录类库所需要的功能,即一条日志有哪些数据,以及如何通过一次记录的方式将同一条日志消息记录到多个日志媒介中.在本文中 ...
- Serilog 源码解析——解析字符串模板
大家好啊,上一篇中我们谈到 Serilog 是如何决定日志记录的目的地的,那么从这篇开始,我们着重于 Serilog 是向 Sinks 中记录什么的,这个大功能比较复杂,我尝试再将其再拆分成几个小块方 ...
- Serilog 源码解析——数据的保存(上)
在上一篇中,我们主要研究了Serilog是如何解析字符串模板的,它只是单独对字符串模板的处理,对于日志记录时所附带的数据没有做任何的操作.在本篇中,我们着重研究日志数据的存储方式.(系列目录) 本篇所 ...
- Serilog 源码解析——数据的保存(下)
上一篇中,我们提到了日志数据是如何进行解析了.然而,Serilog 灵活采用了不同的策略(Policy)决定一个日志对象如何解析到LogEventPropertyValue的子类对象中,即采用了ISc ...
- Serilog 源码解析——Sink 的实现
在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) ...
- Serilog 源码解析——数据的保存(中)
上一篇文章中揭露了日志数据的绑定逻辑,主要说明了日志数据绑定的结果信息,即EventProperty结构体和LogEventProperty类,以及日志数据与具名属性Token的绑定类Property ...
- Sentinel源码解析二(Slot总览)
写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...
- Sentinel源码解析一(流程总览)
引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简 ...
- Sentinel源码解析四(流控策略和流控效果)
引言 在分析Sentinel的上一篇文章中,我们知道了它是基于滑动窗口做的流量统计,那么在当我们能够根据流量统计算法拿到流量的实时数据后,下一步要做的事情自然就是基于这些数据做流控.在介绍Sentin ...
随机推荐
- Python-如何拆分含有多种分隔符的字符串?
案例: 把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下 s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符 有哪些解决方案? 方法1:通过str.spl ...
- Leetcode-栈&队列
20. 有效的括号 https://leetcode-cn.com/problems/valid-parentheses/ 给定一个只包括 '(',')','{','}','[',']' 的字符串,判 ...
- 深入浅出具有划时代意义的G1垃圾回收器
G1诞生的背景 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.HotSpot开发团队最初 ...
- TP5发送邮件
1,前提去qq邮箱开启smtp 2,生成授权码 2,发送短信给 3,附上代码 贴上代码如下 <?phpnamespace app\mails\controller;use \think\Cont ...
- .NET Core使用FluentEmail发送邮件
前言 在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警.消息.进度通知等等.一般情况下我们使用原生的SmtpClient类库居多,它能满足我们绝大多数场景.但是使用起来不够简 ...
- X86保护机制
目录 保护机制的开启与关闭 描述符表限长检查 段限长检查 段类型检查 类型信息的存储 类型检查 空选择子的检查 特权级检查 访问数据段时的特权级检查 访问代码段中的数据 堆栈寄存器SS的特权级检查 在 ...
- MYSQL账户是否不允许远程连接。如果无法连接可以尝试以下方法:
mysql账户是否不允许远程连接.如果无法连接可以尝试以下方法: mysql -u root -p //登录MySQL mysql> GRANT ALL PRIVILEGES ON *.* TO ...
- 解决:npm install ERR! Unexpected end of JSON input
npm ERR! Unexpected end of JSON input npm i -g npm@5 npm install --registry=https://registry.npm.tao ...
- day22 Pyhton学习 re模块和正则表达式
正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个" ...
- vmware 安装tools
kali linux 更换成国内源后 安装tools命令 apt install open-vm-tools-desktop fuse -y 需重启 reboot