首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Serilog解构子类

Serilog解构子类
EN

Stack Overflow用户
提问于 2021-01-18 11:10:16
回答 1查看 273关注 0票数 0

问题

如何为基类配置Serilog解构,以便所有子类都以相同的方式解构?

代码语言:javascript
运行
复制
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配置:

代码语言:javascript
运行
复制
new LoggerConfiguration()
                .Destructure.ByTransforming<Task>(t => 
                    new { TaskId = t.Id, JobId = t.JobId})

基类的位置。

代码语言:javascript
运行
复制
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
}

儿童班是:

代码语言:javascript
运行
复制
public class StoredProcedure : Task
{
    public string ServerDnsName { get; set; }
    public string DatabaseName { get; set; }
    public string StoredProcedureAndSchema { get; set; }
}

初始化模拟storedProcedure任务:

代码语言:javascript
运行
复制
var storedProcedure = new StoredProcedure()
        {
            Id = 1, Description = "description", Enabled = true, Order = 1,
            JobId = 1, Job = new Job { Id = 1, Description = "description", Name = "test"}
        };

当我运行这个:

代码语言:javascript
运行
复制
Log.Information("Test dec {@Task}", storedProcedure);

或者这个:

代码语言:javascript
运行
复制
Log.Information("Test dec {@Task}", (Task)storedProcedure);

Serilog不按配置解构对象。

如果我使用此配置:

代码语言:javascript
运行
复制
new LoggerConfiguration()
                .Destructure.ByTransforming<StoredProcedure>(t => 
                    new { TaskId = t.Id, JobId = t.JobId})

Serilog很好地解构对象,并且只记录这两个属性(TaskId和JobId)。

EN

回答 1

Stack Overflow用户

发布于 2021-01-18 12:45:21

我能够通过以下方法解决这个问题:

代码语言:javascript
运行
复制
.Destructure.ByTransformingWhere<Task>(t => typeof(Task).IsAssignableFrom(t), t => new { TaskId = t.Id, t.JobId})

现在这一切都很好:

代码语言:javascript
运行
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65773392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档