Serilog:是否可以缓存 ILogEventPropertyFactory 产生的 LogEventProperty?
Serilog: Is it okay to cache LogEventProperty produced by ILogEventPropertyFactory?
我正在实施我自己的 ILogEventEnricher
:
public interface ILogEventEnricher
{
void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory);
}
而且我想知道存储由 ILogEventPropertyFactory
创建的 LogEventProperty
对象是否符合习惯,以便我可以在进一步充实期间重用此 属性?因为我不喜欢每次记录调用都重新序列化我的上下文属性的想法。
LogEventProperty
由ILogEventPropertyFactory
创建,本质上是一对属性名称和值。值有一个抽象类型 LogEventPropertyValue
class,它有具体的后代,如 ScalarValue
、StructureValue
、SequenceValue
等。每个 classes只保留原始 属性 值(以某种方式预处理)并在 Render()
方法中以漂亮的格式转储它。
如您所见,LogEventProperty
基本上是一个没有任何魔法的数据包。如果您多次为相同的 属性 名称和值调用 ILogEventPropertyFactory.CreateProperty()
,您将获得相等的 LogEventProperty
个对象,这些对象将在日志中生成相同的数据。
所以是的,出于性能考虑,可以缓存 LogEventProperty
个实例。
我正在实施我自己的 ILogEventEnricher
:
public interface ILogEventEnricher
{
void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory);
}
而且我想知道存储由 ILogEventPropertyFactory
创建的 LogEventProperty
对象是否符合习惯,以便我可以在进一步充实期间重用此 属性?因为我不喜欢每次记录调用都重新序列化我的上下文属性的想法。
LogEventProperty
由ILogEventPropertyFactory
创建,本质上是一对属性名称和值。值有一个抽象类型 LogEventPropertyValue
class,它有具体的后代,如 ScalarValue
、StructureValue
、SequenceValue
等。每个 classes只保留原始 属性 值(以某种方式预处理)并在 Render()
方法中以漂亮的格式转储它。
如您所见,LogEventProperty
基本上是一个没有任何魔法的数据包。如果您多次为相同的 属性 名称和值调用 ILogEventPropertyFactory.CreateProperty()
,您将获得相等的 LogEventProperty
个对象,这些对象将在日志中生成相同的数据。
所以是的,出于性能考虑,可以缓存 LogEventProperty
个实例。