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

ASP.Net Core 2中能否在appsettings.json配置Serilog MsSqlServer列选项?

在ASP.NET Core 2中配置Serilog MsSqlServer Sink的列选项

直接给你结论:ASP.NET Core 2对应的Serilog.Sinks.MSSqlServer版本,确实不支持直接在appsettings.json里配置列选项——这也是你在GitHub上看到未解决议题的原因,当时的配置绑定逻辑还没覆盖到这个细节。

不过别担心,我们可以结合appsettings的基础配置+代码手动指定列选项,既保留配置文件的灵活性,又能实现自定义列的需求。

具体实现步骤

1. 保留appsettings.json里的基础Serilog配置

先把连接字符串、表名这些通用配置放在配置文件里,方便后续修改:

{
  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "YourDatabaseConnectionString",
          "tableName": "ApplicationLogs",
          "autoCreateSqlTable": true
        }
      }
    ]
  }
}

2. 在Program.cs中手动添加列配置

在初始化Serilog的地方,先读取配置文件里的基础设置,再通过代码自定义ColumnOptions:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseSerilog((hostingContext, loggerConfig) =>
        {
            // 先加载appsettings里的Serilog基础配置
            loggerConfig.ReadFrom.Configuration(hostingContext.Configuration);
            
            // 手动配置MsSqlServer的列选项
            var sqlSinkConfig = hostingContext.Configuration.GetSection("Serilog:WriteTo:0:Args");
            loggerConfig.WriteTo.MSSqlServer(
                connectionString: sqlSinkConfig["connectionString"],
                tableName: sqlSinkConfig["tableName"],
                columnOptions: new ColumnOptions
                {
                    // 添加自定义列
                    AdditionalColumns = new List<SqlColumn>
                    {
                        new SqlColumn { ColumnName = "RequestId", DataType = SqlDbType.NVarChar, DataLength = 128 },
                        new SqlColumn { ColumnName = "UserDisplayName", DataType = SqlDbType.NVarChar, DataLength = 256 }
                    },
                    // 还可以调整默认列的行为,比如禁用不需要的列、设置UTC时间戳等
                    DisableTriggers = true,
                    StoreTimestampInUtc = true,
                    // 比如关闭默认的MessageTemplate列
                    MessageTemplate = { Enabled = false }
                },
                autoCreateSqlTable: bool.Parse(sqlSinkConfig["autoCreateSqlTable"])
            );
        })
        .UseStartup<Startup>()
        .Build();

3. 可选:自定义配置绑定(进阶)

如果希望把列配置也放在appsettings里,可以自己创建一个配置类,比如:

public class CustomSqlColumnConfig
{
    public string ColumnName { get; set; }
    public string DataType { get; set; }
    public int? DataLength { get; set; }
}

然后在appsettings.json里添加:

"Serilog": {
  // ... 其他配置
  "SqlColumnOptions": {
    "AdditionalColumns": [
      { "ColumnName": "RequestId", "DataType": "NVarChar", "DataLength": 128 },
      { "ColumnName": "UserDisplayName", "DataType": "NVarChar", "DataLength": 256 }
    ]
  }
}

最后在代码里读取并映射到ColumnOptions:

var customColumns = hostingContext.Configuration
    .GetSection("Serilog:SqlColumnOptions:AdditionalColumns")
    .Get<List<CustomSqlColumnConfig>>();

var columnOptions = new ColumnOptions();
foreach (var col in customColumns)
{
    var sqlDbType = (SqlDbType)Enum.Parse(typeof(SqlDbType), col.DataType);
    columnOptions.AdditionalColumns.Add(new SqlColumn 
    { 
        ColumnName = col.ColumnName, 
        DataType = sqlDbType, 
        DataLength = col.DataLength 
    });
}

补充说明

后续Serilog.Sinks.MSSqlServer针对.NET Core 3.1及以上的版本,已经支持直接在appsettings.json里配置列选项,但ASP.NET Core 2对应的版本没有这个特性,所以只能通过上述代码方式实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:35:04