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 ...
随机推荐
- Vue登录注册,并保持登录状态
关于vue登录注册,并保持登录状态,是vue玩家必经之路,网上也有很多的解决方法,但是有一些太过于复杂,新手可能会看的一脸懵逼,现在给大家介绍一种我自己写项目在用而且并不难理解的一种方法. 项目中有一 ...
- 帮你理清React的生命周期
这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...
- Redis小记(一)
1.redis的数据结构 (1)动态字符串(SDS) redis自身构建了一个简单动态字符串的抽象类型,SDS,在redis里,包含字符串的键值对在底层都是由SDS来实现的. 除了用来保存数据库的字符 ...
- Leetcode PHP题解--D125 107. Binary Tree Level Order Traversal II
val = $value; } * } */ class Solution { private $vals = []; /** * @param TreeNode $root * @return In ...
- 使用精灵代理ip最节约成本的策略!
使用ip代理业务用例 1.使用精灵代理(http://www.jinglingdaili.com/Shop-index.html),通过Api获取,每次返回一个固定时间(五分钟)的IP,然后将获取到的 ...
- C# 中的延时的方法。
转载:https://blog.csdn.net/caixiexin/article/details/5769121 System.Threading.Thread.Sleep(2000); 其中20 ...
- xshell选项卡不见了
最近使用xshell的时候发现建立多个选项卡的时候,因为没有选项卡,所以不能切换. 弄了好一会儿才弄出来 点击会话选项卡或者Ctrl + Shift + T可以调出来
- linux 路径结构
/bin /boot /data /dev /etc /home /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /sr ...
- WesternCTF2018_shrine
这个想了半天没啥思路,直接查别人的wp,贴地址:https://blog.csdn.net/qq_42812036/article/details/104324923 0x00 开始的页面猛一看乱七八 ...
- cocos creator屏幕适配的一些知识点
一. cocos creator 提供的几种适配策略 EXACT_FIT: 整个应用程序在指定区域可见,无需尝试保留原始纵横比.可能会出现失真,应用程序会被拉伸或压缩.也就是说设计分辨率的长和宽不会等 ...