背景

大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下。考虑到最近在自学 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. redis过期策略以及内存淘汰机制(理论+配置)

    一.redis的过期策略: redis的过期策略是:定期删除+惰性删除redis在存储数据时,可能会设置过期时间,而所谓的定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的k ...

  2. PJzhang:CVE-2020-1472微软NetLogon权限提升漏洞~复现

    猫宁~~~ 虚拟机上进行 安装windows 2008 R2 查看服务器ip 本地连接属性,取消ipv6,ip设置为192.168.43.158,子网掩码255.255.255.0,网关192.168 ...

  3. 基于python的webUI自动化-小白基础篇

    最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...

  4. mysql-1-select

    #进阶1:基础查询 /* 语法: SELECT 查询列表 FROM 表名; 特点: 1.查询列表可以是:表中字段.常量值.表达式.函数 2.查询的结果是一个虚拟的表格 */ USE myemploye ...

  5. 玩命学JVM(二)—类加载机制

    前言 Java程序运行图: 上一篇玩命学JVM(一)-认识JVM和字节码文件我们简单认识了 JVM 和字节码文件.那JVM是如何使用字节码文件的呢?从上图清晰地可以看到,JVM 通过类加载器完成了这一 ...

  6. [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran     在iOS的3D开发中常常需要导入通过3DS MAX之类 ...

  7. 087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点

    087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点 本文知识点:封装的概念和特点 说明:因为时间紧张,本人写博客过程中只是对 ...

  8. Redis安装使用以及可能的算法实践

    layout: post title: 2017-12-05-Redis 入门 tags: - Redis - 实时特征 - UCB, Tompson sampling Redis 是什么? Redi ...

  9. 基于SpringAop的鉴权功能

    什么是 AOP 首先我们先了解一下什么是AOP,AOP(Aspect Orient Programming),直译过来就是面向切面编程.AOP是一种编程思想,是面向对象编程(OOP)的一种补充.面向对 ...

  10. Solr6.4.2异常:org.apache.solr.common.SolrException: Error opening new searcher

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明. 原文链接:https://www.cnblogs.com/chenghu/p/13840021.html Solr版本6.4.2 启动S ...