可以使用分解策略来记录对象集合:
public class CollectionDestructuringPolicy<T> : IDestructuringPolicy
{
public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory,
out LogEventPropertyValue result)
{
switch (value)
{
case City city:
result = Destruct(city,propertyValueFactory);
return true;
case ICollection<T> collection:
result = Destruct(collection,propertyValueFactory);
return true;
}
result = null;
return false;
}
private static LogEventPropertyValue Destruct(object collectionItem, ILogEventPropertyValueFactory propertyValueFactory)
{
var collectionItemPropertiesNamePerValue = new List<(string propertyName, object propertyValue)>();
var collectionItemProperties = collectionItem.GetType().GetProperties().ToList();
collectionItemProperties.ForEach(p => collectionItemPropertiesNamePerValue.Add((propertyName:p.Name, propertyValue:p.GetValue(collectionItem))));
var properties = new List<LogEventProperty>(collectionItemPropertiesNamePerValue.Count);
collectionItemPropertiesNamePerValue.ForEach(namePerValue =>
properties.Add(new LogEventProperty(namePerValue.propertyName,
propertyValueFactory.CreatePropertyValue(namePerValue.propertyValue))));
LogEventPropertyValue result = new StructureValue(properties);
return result;
}
private static LogEventPropertyValue Destruct(IEnumerable<T> collection,
ILogEventPropertyValueFactory propertyValueFactory)
{
var elements = collection.Select(e => propertyValueFactory.CreatePropertyValue(e, true));
LogEventPropertyValue result = new SequenceValue(elements);
return result;
}
}
//In Logger Factory:
public static class LoggerFactory
{
public static Logger Create()
{
return new LoggerConfiguration()
.WriteTo.Console()
.Destructure.With<CollectionDestructuringPolicy<City>>()
.CreateLogger();
}
}
马币。有成就的asp.net核心解决方案
sample