Serilog 源码解析——数据的保存(上) (3)

以上为PropertyBinder的部分代码。首先是_valueConverter这个PropertyValueConverter对象,有什么功能,做什么事暂时不清楚,先放一放。向下继续,ConstructProperties函数,该函数作为PropertyBinder的唯一公开函数,提供了整个绑定功能。往下,ConstructNamedProperties函数提供了绑定具名属性 Token 和日志数据的功能。内部主要做了三件事:

获取解析后的MessageTemplate中具名属性Token对象以及其数目;

针对每个具名属性Token在对应的位置构造对应的EventProperty结构

如果消息记录时提供了多于解析出具名属性Token数目的消息数据时,则把后续部分仍保留下来,且设置其Name为__加当前序号。

最后,在构造对应某个EventProperty结构时,采用ConstrctProperty函数进行构造。可以看到,通过构造函数,将具名属性Token的属性名称传给Name值,而具体构造哪种LogEventPropertyValue对象,则有PropertyValueConverter的CreatePropertyValue方法进行构造。由此可见,PropertyValueConverter有点类似于工厂,指明当前消息数据应构造什么LogEventPropertyValue派生类。至于PropertyValueConverter类具体如何做到的,将留到下一篇再讲解吧。

总结

本文对字符串模板解析后的属性 Token 与日志数据的绑定做了大概的介绍。首先说明的是绑定最终得到了什么结果,即EventProperty结构体以及LogEventProperty类。在这些结构体/类的内部,通过LogEventPropertValue保存每一个日志数据,该类是一个抽象类,不同的渲染方式有着不同的继承类。之后,简要描述了下绑定过程,即通过PropertyBinder将每一个具名属性 Token 与对应的日志数据对象绑定。然而,具体的绑定过程没有进行交代,这也是下一篇文章的主要内容,即给定一个属性 Token 与一个日志对象,如何生成对应的EventProperty结构体。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfzyw.html