C# 在Serilog MsSql接收器中填充自定义列
我在dotnet核心应用程序中使用Serilog。我已将自定义列添加到Serilog提供的默认列列表中。下面是我的“Serilog”配置在appsettings.json文件中的样子-C# 在Serilog MsSql接收器中填充自定义列,c#,asp.net-core,serilog,C#,Asp.net Core,Serilog,我在dotnet核心应用程序中使用Serilog。我已将自定义列添加到Serilog提供的默认列列表中。下面是我的“Serilog”配置在appsettings.json文件中的样子- "Serilog": { "MinimumLevel": "Information", "WriteTo": [ { "Name": "MSSqlServer", "
"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": <connectionString>
"tableName": "Log",
"autoCreateSqlTable": true,
"columnOptionsSection": {
"removeStandardColumns": [ "MessageTemplate", "Properties"], //remove the Properties column in the standard ones
"customColumns": [
{
"ColumnName": "ControllerName",
"DataType": "varchar",
"DataLength": 50
}
]
},
"timeStamp": {
"columnName": "Timestamp",
"convertToUtc": true
}
}
}
]
}
这行代码向ControllerName列提供值,但message列获取的值为
"TestController""Starting up.."
我希望消息列的值为
Starting up..
似乎您使用的是Microsoft的
ILogger
而不是Serilog的ILogger
,因此,为了添加将包含在日志事件中的上下文属性,而不将其作为消息的一部分,您必须使用BeginScope
创建一个新属性
using (_logger.BeginScope("{ControllerName}", nameof(TestController)))
{
_logger.LogInformation("{Message}", "Starting up...");
}
另一种选择是将属性添加到Serilog的LogContext
:
using (LogContext.PushProperty("ControllerName", nameof(TestController))
{
_logger.LogInformation("{Message}", "Starting up...");
}
var contextLogger = logger.ForContext("ControllerName", nameof(TestController));
contextLogger.Information("{Message}", "Starting up...");
这将为您提供与上面使用BeginScope
相同的最终结果,但这是一个Serilog特定的API,有点违背了首先使用ILogger
的目的,因此除非您决定改用Serilog的ILogger
,否则首选BeginScope
一个重要的观察结果是,为了使LogContext
工作,您需要在配置记录器时启用它。例如:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext() // <<<<<<<<<<#############
.WriteTo.Console()
.CreateLogger();
ps:如果您不确定是否应该使用Microsoft的
ILogger
或Serilog的ILogger
,我建议您阅读以下答案:@CamiloTerevinto:“ControllerName”只是一个示例,也是POC的一部分。实际上,我想使用一个或多个自定义列,并在登录时为它们提供值。列,如-Service Name等。您可以使用IDiagnosticContext
接口设置其他属性。可以作为起点here@PavelAnikhouski-我发现这很有用-我想知道使用LogContext.PushProperty()是否合适?有什么性能问题吗?
var contextLogger = logger.ForContext("ControllerName", nameof(TestController));
contextLogger.Information("{Message}", "Starting up...");