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
相关产品推荐
相关产品推荐

