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

如何让Serilog中LogContext添加的属性成为日志顶级属性?

解决Serilog LogContext属性嵌套在Properties中的问题

你的问题核心是Serilog的输出配置导致LogContext添加的属性被嵌套到Properties对象里,以下是直接的解决方法:

1. 检查并修改输出模板配置

如果你的Serilog配置中指定了OutputTemplate且包含{Properties},这会强制将所有额外属性打包到Properties子对象中。移除OutputTemplate中的{Properties}字段,改用JSON格式化器来处理属性的扁平化输出。

错误示例(会导致嵌套):

.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Properties}")

2. 使用正确的JSON格式化器

推荐使用Serilog的Compact JSON格式化器或标准JSON格式化器,并确保配置正确:

方法一:使用CompactJsonFormatter(推荐)

Compact格式化器默认会将LogContext属性输出为顶级字段,无需额外配置:

// 先安装NuGet包:Serilog.Formatting.Compact
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext() // 必须启用LogContext
    .WriteTo.Console(new CompactJsonFormatter())
    .CreateLogger();

方法二:使用JsonFormatter

如果使用标准JsonFormatter,需设置renderMessage: true,并避免在OutputTemplate中指定{Properties}:

// 安装NuGet包:Serilog.Formatting.Json
Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Console(new JsonFormatter(renderMessage: true))
    .CreateLogger();

3. 确认LogContext已启用

确保在Logger配置中添加了.Enrich.FromLogContext(),这是LogContext属性能被添加到日志中的前提条件。

4. 配置文件方式(ASP.NET Core)

如果用appsettings.json配置,确保格式化器配置正确:

{
  "Serilog": {
    "Enrich": ["FromLogContext"],
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }
}

完成以上配置后,LogContext.PushProperty()添加的属性就会作为顶级字段出现在日志JSON中,而非嵌套在Properties对象里。

内容的提问来源于stack exchange,提问作者JHJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:26:12