【问题标题】:Serilog deconstruct child classSerilog 解构子类
【发布时间】: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


    【解决方案1】:

    我能够通过使用这个来解决这个问题:

    .Destructure.ByTransformingWhere<Task>(t => typeof(Task).IsAssignableFrom(t), t => new { TaskId = t.Id, t.JobId})
    

    现在可以正常工作了:

    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);
    

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多