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

背景 大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下.考虑到最近在自学 ASP.NET Core 的相关开发,对 Serilog 这个日志记录库使用较多,好奇其内部的实现原理,趁着这段咸鱼时间好好地研究了下 Serilog 的源码,顺带复习了一些常用的设计模式.目前计划写成一个系列介绍 Serilog 的实现,如有错误还请指正. 日志记录 在分析源码前,我们首先要知道 Serilog 是什么,它的功能是什么,能做什么事.俗话说知己知彼,百…
在上两篇文章(链接1和链接2)中,我们通过一个简易 demo 了解到了一个简单的日志记录类库所需要的功能,即一条日志有哪些数据,以及如何通过一次记录的方式将同一条日志消息记录到多个日志媒介中.在本文中,针对 Serilog,我们从以下几个方面来了解 Serilog 核心功能需求和用法,并为下一篇正式开始探究源码准备相关工作.(系列目录) Serilog 核心功能 目前,在 Asp.net core 中,对于日志记录库,除了微软官方准备的 Microsoft.Extensions.Logging…
大家好啊,上一篇中我们谈到 Serilog 是如何决定日志记录的目的地的,那么从这篇开始,我们着重于 Serilog 是向 Sinks 中记录什么的,这个大功能比较复杂,我尝试再将其再拆分成几个小块方便大家理解.(系列目录) 本篇要解决什么 之前提到,在Logger类中构造对应的LogEvent对象之前,日志记录器通过MessageTemplateProcessor类对象的Process方法处理字符串模板和传入进来的数据信息.这个方法内部只是做了两件事: 解析消息模板,分析哪些是字符串字面值哪些…
在上一篇中,我们主要研究了Serilog是如何解析字符串模板的,它只是单独对字符串模板的处理,对于日志记录时所附带的数据没有做任何的操作.在本篇中,我们着重研究日志数据的存储方式.(系列目录) 本篇所解决的内容 本文主要讲述在Serilog中日志记录器是如何记录数据的,即在上一篇文章中解析部分的第二件事.和之前的文章架构一样,本篇文章主要从数据存储和行为逻辑两个方面做阐述. public void Process(string messageTemplate, object[] messageT…
上一篇中,我们提到了日志数据是如何进行解析了.然而,Serilog 灵活采用了不同的策略(Policy)决定一个日志对象如何解析到LogEventPropertyValue的子类对象中,即采用了IScalarConversionPolicy以及IDestructingPolicy接口对数据做转换.在本篇中,着重强调这两个接口以及其实现类是如何做到这一功能的.(系列目录) IScalarConversionPolicy接口 interface IScalarConversionPolicy { b…
在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) 基础功能 在开始看 Serilog 怎么将日志记录到 Sinks 之前,先看下整体框架.首先,我们需要了解 Serilog 中最常用的一个接口ILogger,它提供了对外记录日志的所有功能 API 方法. ILogger(核心接口) 在 Serilog 根目录下,保存有 4 个代码文件.类似于 L…
上一篇文章中揭露了日志数据的绑定逻辑,主要说明了日志数据绑定的结果信息,即EventProperty结构体和LogEventProperty类,以及日志数据与具名属性Token的绑定类PropertyBinder.在本文中,我们主要对PropertyValueConverter类及其涉及的其他相关类进行说明.关注的重点在如何利用具名属性 Token 以及对应的日志数据来构造对应的LogEventPropertyValue类对象.(系列目录) PropertyValueConverter类 Pro…
写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(slot)的源码. 默认插槽链的调用顺序,以及每种类型Node节点的关系都在上面文章开头分析过 Sentinel源码解析一 NodeSelectorSlot /** * 相同的资源但是Context不同,分别新建 DefaultNode,并以ContextName为key */ private vol…
引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简单,在 Sentinel中资源定义和规则配置是分离的,也就是说用户可以先通过Sentinel API给对应的业务逻辑定义资源(埋点),然后在需要的时候再配置规则,通过这种组合方式,极大的增加了Sentinel流控的灵活性. 引入Sentinel带来的性能损耗非常小.只有在业务单机量级超过25W QP…
引言 在分析Sentinel的上一篇文章中,我们知道了它是基于滑动窗口做的流量统计,那么在当我们能够根据流量统计算法拿到流量的实时数据后,下一步要做的事情自然就是基于这些数据做流控.在介绍Sentinel的流控模型之前,我们先来简单看下 Sentinel 后台是如何去定义一个流控规则的 对于上图的配置Sentinel把它抽象成一个FlowRule类,与其属性一一对应 resource 资源名 limitApp 限流来源,默认为default不区分来源 grade 限流类型,有QPS和并发线程数两…