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

如何让Serilog文件接收器输出键名带引号的合法JSON日志?

解决Serilog文件接收器输出合法JSON的问题

问题核心在于文件接收器的输出模板未指定结构化日志格式器:控制台接收器使用了{Message:lj}格式符(其中lj代表LiteralJson,会将结构化数据序列化为标准JSON),而文件接收器仅用{Message},默认采用简洁的非JSON格式输出,导致键名不带引号。

只需修改appsettings.json中文件接收器的outputTemplate,将{Message}替换为{Message:lj}即可:

{
  "AllowedHosts": "*",
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.Hosting.Lifetime": "Information",
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext" ],
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "{Timestamp:HH:mm:ss.fff} {Level:u3} {SourceContext} {Message:lj}{NewLine:1}{Exception:1}"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/log.log",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}|{Level:u3}|{SourceContext}|{Message:lj}{NewLine:1}{Exception:1}"
        }
      }
    ]
  }
}

修改后,文件日志的结构化数据会和控制台输出一致,呈现合法JSON格式:

2023-01-27 08:09:38.880|INF|My.Test|HERE IT IS
2023-01-27 08:09:38.884|INF|My.Test|HERE IT IS {"Foo": "bar"}
2023-01-27 08:09:38.888|INF|My.Test|HERE IS ANOTHER ONE {"x": 1, "y": "2"}
2023-01-27 08:09:38.889|INF|My.Test|HERE IS DATA {"Name": "my data", "Value": 27.82859584, "IsValid": true, "$type": "Data"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:45:50