【发布时间】:2018-08-08 09:30:36
【问题描述】:
我正在为 .NET Core 2 使用 Serilog SQL Server Sink。
我在Program.cs 和Startup.cs 中都配置了Serilog.Logger,如下所示:
ColumnOptions columnOptions = new ColumnOptions();
columnOptions.AdditionalDataColumns = new System.Collections.Generic.List<DataColumn>();
columnOptions.AdditionalDataColumns.Add(new DataColumn() { ColumnName = "UserId", DataType = typeof(string) });
Log.Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer("Data Source=TS-ABC\\SQLExpress;Initial Catalog=XYZ;Integrated Security=True",
"ActivityLogs", columnOptions: columnOptions, autoCreateSqlTable: false, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Debug)
.CreateLogger();
在Sstartup.cs:
services.AddSingleton<Serilog.ILogger>(x =>
{
ColumnOptions columnOptions = new ColumnOptions();
columnOptions.AdditionalDataColumns = new System.Collections.Generic.List<DataColumn>();
columnOptions.AdditionalDataColumns.Add(new DataColumn() { ColumnName = "UserId", DataType = typeof(string) });
return new LoggerConfiguration().WriteTo.MSSqlServer(Configuration["Data:DefaultConnection:ConnectionString"], Configuration["Serilog:TableName"], autoCreateSqlTable: false, columnOptions: columnOptions, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Debug).CreateLogger();
});
UserId 是 string 类型,允许空值。它也是 ActivityLogs 表中的 FK。
这就是我记录信息的方式:
Log.Information("This has properties attached");
只要添加了额外的列"UserId",代码就可以正常工作。 UserId 列已存在于我的数据库中。
这是我在 Visual Studio 的输出窗口中看到的错误:
由于以下错误,无法将 50 个日志事件写入数据库:字典中不存在给定的键。
现在更新到Serilog.Sinks.MSSqlServer nuget 包后,我收到以下错误,并且没有任何内容登录到数据库中。
由于以下错误,无法将 1 个日志事件写入数据库:给定的 ColumnMapping 与源或目标中的任何列都不匹配。
我们将不胜感激任何解决方案、提示或解决方法。
【问题讨论】:
-
“只要添加了附加列“UserId”,代码就可以正常工作。UserId 列已经存在于我的数据库中。” - 那么问题出在哪里?跨度>
-
@stuartd,我已经更新了问题。
-
您的问题帮助我解决了我遇到的问题。我使用的是 Serilog.Sinks.MSSQLServerCore,因为我的印象是 Serilog.Sinks.MSSqlServer 与 .Net Core 不兼容。谢谢。
-
我正在使用 Serilog.Settings.Configuration v2.5.0 和 Serilog.AspNetCore v2.1.0。你用的是同一个版本吗?
标签: c# sql-server .net-core serilog