如何配置Serilog SQL Sink将Properties数据以JSON而非XML记录
解决Serilog SQL Sink Properties列存储JSON格式的问题
我来帮你搞定这个问题!你已经安装了Serilog.Formatting.Compact包,但大概率是配置的位置不对导致没生效,下面一步步来修正:
1. 确认依赖包安装正确
先确保你已经安装了以下必要的NuGet包(如果没装全,先补上):
Serilog.AspNetCoreSerilog.Sinks.MSSqlServerSerilog.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参数必须放在MSSqlServer的Args节点下,指定使用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




