Serilog序列化对象仅输出_typeTag但JsonConvert可正常序列化问题咨询
问题原因
- 最常见的诱因是
SubmitImportJobRequest类实现了IEnumerable接口:Serilog默认序列化逻辑会将实现IEnumerable的类型识别为集合类型,若该集合实例为空,就只会输出_typeTag标识,不会序列化类的其他成员。 - 其次可能是该类标记了
[DataContract]特性但未给需要序列化的属性添加[DataMember]特性:Serilog默认序列化器会遵循数据契约约定,未标记[DataMember]的成员不会被序列化输出。 - 也有可能是该类的属性均无公共getter:Serilog默认仅序列化公共可读的类属性,无公共访问器的属性会被自动忽略。
解决办法
方案1:修正类定义或添加序列化标记
如果确认SubmitImportJobRequest实现了IEnumerable但不需要按集合类型序列化,直接给类添加[DestructureAsObject]特性,强制Serilog将其作为普通对象处理即可。如果使用了[DataContract],给需要输出的属性补充[DataMember]标记。
方案2:配置Serilog使用Newtonsoft.Json序列化器
对齐你常用的JsonConvert序列化逻辑,避免两边序列化规则不一致的问题:
- 首先安装NuGet包
Serilog.Sinks.NewtonsoftJson - 调整Serilog配置,示例如下:
new LoggerConfiguration() // 其他原有配置 .WriteTo.ApplicationInsights( telemetryClient, TelemetryConverter.Events(), new NewtonsoftJsonFormatter(new JsonSerializerSettings { // 此处填写你平时使用JsonConvert时的配置项,保证序列化逻辑完全一致 ContractResolver = new DefaultContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore })) .CreateLogger();
方案3:显式指定该类型的解构规则
全局配置Serilog对SubmitImportJobRequest的序列化逻辑,无需修改类定义:
new LoggerConfiguration() .Destructure.ByTransforming<SubmitImportJobRequest>(req => new { // 按需求列出需要输出的属性即可 req.JobId, req.BatchSize, req.ImportParams }) // 其他原有配置
临时应急方案
如果只是临时需要输出完整对象,打日志时提前序列化即可:
_logger.LogInformation("myserilog {submitImportJobRequest}", JsonConvert.SerializeObject(submitImportJobRequest));
内容的提问来源于stack exchange,提问作者techno
相关产品推荐
相关产品推荐

