【问题标题】:Populate custom columns in Serilog MsSql sink在 Serilog MsSql 接收器中填充自定义列
【发布时间】:2020-10-11 20:24:47
【问题描述】:

我在我的 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
      }
    }
    }
]
}

所以我从 Serilog 创建的默认列列表中删除了“MessageTemplate”和“Properties”,并将 “ControllerName” 作为新列添加到表 Log ,其中 Serilog 记录其数据。我想要的是,当我记录信息时,我想为“ControllerName”列提供值。如何做呢? 我找到了以下解决方案:

_logger.LogInformation("{ControllerName}{Message}", "TestController", "Starting up.."); 

这行代码为 ControllerName 列提供值,但 message 列获取值

"TestController""Starting up.."

我希望消息列获得值

 Starting up..

【问题讨论】:

  • @CamiloTerevinto :“ControllerName”只是一个示例,也是 POC 的一部分。实际上,我想使用一个或多个自定义列并在记录时为它们提供值。列,如 - 服务名称等。
  • 您可以使用IDiagnosticContext 接口设置附加属性。 Logging the selected Endpoint Name with Serilog这里可以作为起点
  • @PavelAnikhouski - 我发现这很有用 - github.com/serilog/serilog/wiki/Enrichment 我想知道使用 LogContext.PushProperty() 可以吗?任何性能问题?

标签: c# asp.net-core serilog


【解决方案1】:

您似乎使用的是 Microsoft 的 ILogger&lt;T&gt; 而不是 Serilog 的 ILogger,因此为了添加将包含在您的日志事件中而不是消息的一部分的上下文属性,您必须创建一个新的 logging scope使用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..."); 
}

这将为您提供与上述 BeginScope 相同的最终结果,但它是一个特定于 Serilog 的 API,并且首先违背了使用 ILogger&lt;T&gt; 的目的,因此除非您使用 BeginScope决定改用 Serilog 的ILogger

一个重要的观察是,为了使LogContext 工作,您需要在配置记录器时启用它。例如:

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext() // <<<<<<<<<<#############
    .WriteTo.Console()
    .CreateLogger();

如果您要使用 Serilog 的 ILogger,那么除了能够使用 LogContext 之外,您还可以使用 Log.ForContext 创建一个新的上下文:

var contextLogger = logger.ForContext("ControllerName", nameof(TestController));
contextLogger.Information("{Message}", "Starting up...");

ps:如果你不确定应该使用微软的ILogger&lt;T&gt;还是Serilog的ILogger,我推荐阅读这个答案:Serilog DI in ASP.NET Core, which ILogger interface to inject?

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多