首页 > 解决方案 > 调整 SeriLog 中的 ElasticsearchSinkOptions.NumberOfShards 在 .Net 核心中不起作用

问题描述

我在通过 SeriLog 写入日志时为 ElasticSearch 设置 NumberOfShards 时遇到问题。我在 .Net Core 中像这样为 Serilog 进行配置

 .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(config.ElasticConnectionUrl))
                    {
                        AutoRegisterTemplate = true,
                        IndexFormat = config.ElasticIndex + "-{0:yyyy.MM.dd}",
                        NumberOfShards = 2,
                        NumberOfReplicas = 0
                    }));

但是当我在 Kibana 中查询创建的 Index 的设置时,numberOfShards 仍然是 5(默认值)。即使对于 NumberOfReplicas 也不会影响。

我正在使用 ELK 堆栈来跟踪日志。

有人知道为什么吗?

标签: elasticsearch.net-corekibanaelastic-stackserilog

解决方案


您可以在代码中或 appSettings.json 配置中进行 Serilog 配置。如果你这样做:

var loggerConfiguration = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration) // <= this reads from config
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(config.ElasticConnectionUrl))
    {
        AutoRegisterTemplate = true,
        IndexFormat = config.ElasticIndex + "-{0:yyyy.MM.dd}",
        NumberOfShards = 2,
        NumberOfReplicas = 0
    })); // this gets partially ignored

你有以下配置文件:

"Serilog": {
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "http://localhost:9100"
        }
      }
    ]
}

如果您在 JSON 文件中将索引格式留空,那么您可能会有一个名为“log-stash-{0:YYYY-MM-DD}”的索引,但您也将拥有一个在代码中添加。URI 也是如此。如果您在 JSON 接收器WriteToElasticsearchSinkOptionsin 代码中添加了一个,则可能有两个。

配置为 JSON 或代码。选择一个(遗憾)。有关更多信息,请参见:https ://github.com/serilog/serilog-sinks-elasticsearch/issues/180

我一直在寻找一种方法来在代码中进行默认配置,这可能会被配置文件覆盖,因为我正在尝试为我们公司的各种 API 创建一个通用的固执己见的 IHostBuilder,但 Serilog 运行良好。我的解决方案是将Sinks配置移出Serilog配置部分,并单独定义,然后自己加载(格式相同-字符串名称,Args Dictionary<string,string>),然后手动创建配置代码。


推荐阅读