You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置Serilog SQL Sink将Properties数据以JSON而非XML记录

解决Serilog SQL Sink Properties列存储JSON格式的问题

我来帮你搞定这个问题!你已经安装了Serilog.Formatting.Compact包,但大概率是配置的位置不对导致没生效,下面一步步来修正:

1. 确认依赖包安装正确

先确保你已经安装了以下必要的NuGet包(如果没装全,先补上):

  • Serilog.AspNetCore
  • Serilog.Sinks.MSSqlServer
  • Serilog.Formatting.Compact

可以通过NuGet包管理器或者命令行安装:

Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.MSSqlServer
Install-Package Serilog.Formatting.Compact

2. 修正appsettings.json的Serilog配置

关键是要把格式化器的配置放在SQL Sink的节点内部,而不是Serilog的根节点。下面是正确的配置示例,你可以对照修改:

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "WriteTo": [
    {
      "Name": "MSSqlServer",
      "Args": {
        "connectionString": "你的数据库连接字符串",
        "tableName": "Logs",
        "autoCreateSqlTable": true,
        // 重点:添加这行配置指定JSON格式化器
        "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact",
        "columnOptionsSection": {
          "addStandardColumns": [ "LogEvent" ],
          "removeStandardColumns": [ "Properties" ],
          // 自定义Properties列确保存储JSON兼容类型
          "customColumns": [
            {
              "ColumnName": "Properties",
              "DataType": "nvarchar",
              "DataLength": -1
            }
          ]
        }
      }
    }
  ]
}

配置要点说明:

  • formatter参数必须放在MSSqlServerArgs节点下,指定使用CompactJsonFormatter(来自Serilog.Formatting.Compact包)。
  • 如果你的日志表已经存在,需要确保Properties列的类型是nvarchar(max)(原XML类型的列会自动解析XML,改成nvarchar(max)才能正常存储JSON字符串;如果开启autoCreateSqlTable: true,Serilog会自动创建正确类型的列)。
  • 如果你想让日志事件的整个内容都以更紧凑的JSON存储,也可以替换为Serilog.Formatting.Compact.RenderedCompactJsonFormatter, Serilog.Formatting.Compact,它会包含渲染后的消息和完整结构化数据。

3. 验证配置生效

修改配置后,重启你的ASP.NET Core Web API项目,生成几条测试日志,然后查看数据库的Logs表,Properties列应该已经是JSON格式的字符串了。

如果还是没生效,可以检查以下几点:

  • 确认appsettings.json没有语法错误(比如逗号缺失、括号不匹配)。
  • 确认程序启动时正确加载了Serilog配置,比如Program.cs中的代码:
var builder = WebApplication.CreateBuilder(args);

// 加载Serilog配置
builder.Host.UseSerilog((context, configuration) =>
    configuration.ReadFrom.Configuration(context.Configuration));

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

火山引擎 最新活动