You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Serilog/Elasticsearch日志中移除对象类型信息?

问题:移除Serilog/Elasticsearch日志中的实体类型信息

我创建了如下对象:

var people = new List<Person> {
    new Person { Name = "John Doe", Age = 30 },
    new Person { Name = "Jane Doe", Age = 25 }
};

使用语句 logger.LogInformation("{@people }", people); 记录日志时,Serilog/Elasticsearch生成的日志为:

[Person { Name: "John Doe", Age: 30 }, Person { Name: "Jane Doe", Age: 25 }]

但我需要输出如下格式:

[{"Name":"John Doe","Age":30},{"Name":"Jane Doe","Age":25}]

请问该如何移除日志中的实体类型信息?

解决方案

方法1:配置JSON格式化器

在Serilog的Elasticsearch输出配置中,指定使用纯JSON格式化器,替代默认的带类型标识的格式:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://your-elasticsearch-url:9200"))
    {
        Formatter = new JsonFormatter() // 或CompactJsonFormatter,输出更紧凑的JSON
    })
    .CreateLogger();

方法2:转换为匿名类型记录

在日志记录前,将Person对象转换为匿名类型,这样Serilog不会保留原实体的类型信息:

var anonymousPeople = people.Select(p => new { p.Name, p.Age }).ToList();
logger.LogInformation("{@people}", anonymousPeople);

方法3:配置自定义解构规则

通过Serilog的DestructureAPI,定义Person类型的解构方式,只输出属性内容:

Log.Logger = new LoggerConfiguration()
    .Destructure.ByTransforming<Person>(person => new { person.Name, person.Age })
    .WriteTo.Elasticsearch(...)
    .CreateLogger();

方法4:直接序列化对象为JSON字符串

如果需要完全控制输出格式,可先将对象序列化为JSON字符串再记录:

using System.Text.Json;

var peopleJson = JsonSerializer.Serialize(people);
logger.LogInformation("{people}", peopleJson);

内容的提问来源于stack exchange,提问作者Jaczura Zoltán

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:16:00