背景

大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下。考虑到最近在自学 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. Spring学习(七)--Spring的AOP

    1.实现AOP的方式:通过proxy代理对象.拦截器字码翻译等. 2.AOP体系分层图,从高到低,从使用到实现: 基础:待增强或者目标对象 切面:对基础的增强应用 配置:把基础和切面结合起来,完成切面 ...

  2. makefile实验四 编译本地的源文件 + 变量的高级主题一

    <一>编译本地的源文件 + 变量的模式替换    实验代码 root@ubuntu:~/Makefile_Test/5make_test# vim makefile target := t ...

  3. 042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用——循环输出英文字母

    042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用--循环输出英文字母 本文知识点:案例演示while循环的使用2 ...

  4. matlab中colormap

    来源:https://ww2.mathworks.cn/help/matlab/ref/colormap.html?searchHighlight=colormap&s_tid=doc_src ...

  5. .NET Standard SDK 样式项目中的目标框架

    系列目录     [已更新最新开发文章,点击查看详细] 包表示形式 .NET Standard 引用程序集的主要分发载体是 NuGet 包. 实现会以适用于每个 .NET 实现的各种方式提供. NuG ...

  6. const、define 和 static 的区别

    目录 define.const static define.const 在 C++ 中,const 和 define 都可以用来定义常量.但是这二者之间有很大的区别: define 的作用 用 def ...

  7. 制作西北地区地图数据并maskout

    1.从全国地图数据中选中西北5省:打开bou2_4p.shp文件添加相应的图层(中国各省的行政区域),选中工具栏中的"通过矩形选择要素"工具,用鼠标点击选择要输出的图元,按住ctr ...

  8. 物联网wifi模块

    物联网wifi模块 物联网wifi模块 是上海卓岚推出的MQTT+JSON转Modbus物联网WiFi核心模块.支持以MQTT的方式连接云端服务器,支持可以界面话配置,自主采集Modbus仪表/645 ...

  9. iNeuOS工业互联平台,设备容器(物联网)改版,并且实现设备数据点的实时计算和预警。发布3.2版本

    目       录 1.      概述... 2 2.      平台演示... 2 3.      设备容器新版本介绍... 2 4.      全局数据计算及预警平台... 3 5.      ...

  10. 请求https接口时报错:Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificat,安装certifi

    如何解决SSL 根证书验错误: 一种解决方法是:verify=False 在session.request 里面: session.post(post_url,data=post_data,heade ...