首页 > 解决方案 > ELK logstash 无法在 ES 中创建索引

问题描述

在遵循这个tuto(https://www.bmc.com/blogs/elasticsearch-logs-beats-logstash/)之后为了使用logstash分析一些日志文件,我的索引第一次创建得很好,然后我想要用新的过滤器和新的存储库重新索引新文件,所以我通过“curl XDELETE”删除了索引,现在当我重新启动logstash和filebeat时,不再创建索引。启动组件时我没有看到任何错误。我是否需要删除其他内容才能重新创建索引?

标签: elasticsearchlogstashfilebeat

解决方案


好的,因为我的猜测(见评论)是正确的,这里是解释:

为了避免 filebeat 一遍又一遍地读取和发布文件的行,它使用注册表来存储收割机的当前状态:

注册表文件存储了 Filebeat 用来跟踪上次读取位置的状态和位置信息。

正如您所说,filebeat 成功收集了文件,将行发送到 logstash,logstash 将事件发布到创建所需索引的 elasticsearch。由于 filebeat 更新了它的注册表,因此不必再收集任何行,因此即使您删除了索引,也不会再次将事件发布到 logstash。当您插入一些新行时,filebeat 重新打开了harvester 并仅将新行(位于“注册表检查点”之后)发布到logstash。

注册表文件的默认位置是${path.data}/registry(请参阅Filebeat 的目录布局概述)。

...也许 curl api 调用不是重新启动索引的最佳解决方案

这与删除索引无关。删除索引发生在 elasticsearch 内部。Filebeat 不知道您在 elasticsearch 中的操作。

问:有没有办法根据旧日志重新创建索引?

是的,您应该考虑一些方法:

  • 您可以使用reindex API将文档从一个索引复制到另一个索引。您可以在将文档重新索引到新索引中的同时更新文档。
  • 与 reindex 相比,您可以使用update by query API来更新将保留在原始索引中的文档。
  • 最后,您当然可以删除注册表文件。但是,这可能会导致数据丢失。但出于开发目的,我想这很好。

希望我能帮助你。


推荐阅读