【发布时间】:2021-04-22 16:25:07
【问题描述】:
问题
如何为基类配置 Serilog 解构,以便所有子类都以相同的方式解构?
new LoggerConfiguration()
.Destructure.ByTransforming<BaseAbstractClass>(t =>
new { TaskId = t.Id, JobId = t.JobId})
var childClass = new ChildClass { Id = 1, JobId = 1, SomeOtherPropertyIDoNotCareAbout = "value"};
Log.Information("{@ChildClass}", childClass )
public abstract class BaseAbstractClass
{
public int Id { get; set; }
public int JobId { get; set; }
}
public class ChildClass: BaseAbstractClass
{
public string SomeOtherPropertyIDoNotCareAbout { get; set; }
}
上下文
我得到了以下 Serilog 配置:
new LoggerConfiguration()
.Destructure.ByTransforming<Task>(t =>
new { TaskId = t.Id, JobId = t.JobId})
基础任务类在哪里
public abstract class Task
{
public int Id { get; set; }
public int JobId { get; set; }
public Job Job { get; set; }
public TaskType Type { get; set; }
public string Description { get; set; }
public int Order { get; set; }
public bool Enabled { get; set; }
}
public enum TaskType
{
StoredProcedure
}
而子类是:
public class StoredProcedure : Task
{
public string ServerDnsName { get; set; }
public string DatabaseName { get; set; }
public string StoredProcedureAndSchema { get; set; }
}
初始化一个模拟的 storedProcedure 任务:
var storedProcedure = new StoredProcedure()
{
Id = 1, Description = "description", Enabled = true, Order = 1,
JobId = 1, Job = new Job { Id = 1, Description = "description", Name = "test"}
};
当我运行这个时:
Log.Information("Test dec {@Task}", storedProcedure);
或者这个:
Log.Information("Test dec {@Task}", (Task)storedProcedure);
Serilog 不会按照配置解构对象。
如果我使用这个配置:
new LoggerConfiguration()
.Destructure.ByTransforming<StoredProcedure>(t =>
new { TaskId = t.Id, JobId = t.JobId})
Serilog 可以很好地解构对象,并且只记录这两个属性(TaskId 和 JobId)
【问题讨论】:
标签: c# .net inheritance logging serilog