如何在 .NET Core 3.1 的应用程序设置中配置 Serilog Elasticsearch 错误处理?

How to configure Serilog Elasticsearch error hanling in appsettings in .NET Core 3.1?

我正在尝试在 .NET Core 3.1 (C#) 项目中配置 Serilog,但我想在 appsettings.json 中完全做到这一点。对于 file sinks 我做了所有配置 w/o 任何问题,但是对于 elasticsearch 我不知道如何将下面的行写入appsettings.json 这样它就可以工作了:

.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
{
    FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
    EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog |
                       EmitEventFailureHandling.WriteToFailureSink |
                       EmitEventFailureHandling.RaiseCallback,
    FailureSink = new FileSink("./failures.txt", new JsonFormatter(), null)
})

Official documentation 仅显示 EmitEventFailure 的基本示例,如下所示:

"emitEventFailure": "WriteToSelfLog"

它没有说明 EmitEventFailures 的组合(多个标志)应该如何写。 FailureSink 的情况相同:

"failureSink": "My.Namespace.MyFailureSink, My.Assembly.Name"

我不知道这到底是什么意思,也无法理解上面列出的代码示例。

最后,对于 FailureCallback,文档没有提及通过 appsettings.json 执行此操作的任何选项。但是这个选项对我来说没什么大不了的,最差我可以省略它。

感谢任何提示!

经过长时间的研究,我得出了以下答案。

对于“emitEventFailure”属性,我们只需要在值之间加上逗号,如下所示:

"emitEventFailure": "WriteToFailureSink, WriteToSelfLog, RaiseCallback",

关于failureSink属性,复杂的参数值绑定可以参考这个link。在指定每个参数(包括参数的对象)之前,我们需要设置对象的“类型”。 在我的示例中是将 azure blob 存储设置为故障接收器:

"failureSink": {
        "type": "Serilog.Sinks.AzureBlobStorage.AzureBatchingBlobStorageSink, Serilog.Sinks.AzureBlobStorage",
        "blobServiceClient": {
          "type": "Azure.Storage.Blobs.BlobServiceClient, Azure.Storage.Blobs",
           "connectionString": "DefaultEndpointsProtocol=https;AccountName=xyz;AccountKey=xyzkey;EndpointSuffix=xyz.net"
        },
        "textFormatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter, Serilog.Formatting.Elasticsearch",
        "storageContainerName": "test-api",
        "storageFileName": "test/{yyyy}-{MM}-{dd}.log",
        "period": "0.00:00:30",
        "batchSizeLimit": "1000"
        
      }