如何在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
相关产品推荐
相关产品推荐

