Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Serilog MsSql接收器中填充自定义列_C#_Asp.net Core_Serilog - Fatal编程技术网

C# 在Serilog MsSql接收器中填充自定义列

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", "

我在dotnet核心应用程序中使用Serilog。我已将自定义列添加到Serilog提供的默认列列表中。下面是我的“Serilog”配置在appsettings.json文件中的样子-

"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...");