如果有熟悉设计模式的小伙伴就会发现,这就是建造者模式的一种实现,针对复杂的对象创建,构造一个建造者对其建造。建造的选项和核心类区分开,也是单一职责原则的体现。
v7项目结构考虑到v7版本中较为多的类,我给出了v7版本的类图。
在类图的右上半部分,LogLevel描述了日志等级的枚举,LogData描述了一次日志记录应该包含哪些信息,其中它包含对日志等级的引用。
在类图的右下半部分,ILogTarget描述了将日志信息LogData对象写入目的地的接口,继承该接口的ConsoleTarget以及FileTarget类分别实现了对控制台和文件的日志记录。
在正中间,Logger类负责日志的记录,内部维护了ILogTarget数组,该数组表示Logger对象应该向哪些目的地写入日志信息,其具体的目的地写入信息由继承ILogTarget接口的类负责。另外,Logger提供了若干 API 方法负责对不同日志等级的日志写入。
在左边,LogBuilder类负责构造Logger对象,其内部维护ILogTarget列表,添加新的日志记录地也就是向列表中添加新的对象,CreateLogger函数利用该列表创建对应的Logger对象。在左下角部分,Demo 通过扩展方法向LogBuilder类提供向控制台和文件写入功能的函数AddConsole以及AddFile。
总结好了,到v7版本位置,LogDemo 的演化到这就结束了,如果大家对这个小 Demo 能够理解的话,那么再理解后续的 Serilog 源码中最核心的部分就会轻松很多。实际上,Serilog 能够利用强大的扩展性添加不同的功能和本 Demo 类似,大多通过接口进行功能扩展的。下一篇文章主要通过对 Serilog 的使用方式来了解Serilog一些基本功能,以及如何获取Serilog相应的源码。