在 Logstash 配置中每天为 Elasticsearch 创建一个新索引

Create a new index per day for Elasticsearch in Logstash configuration

我打算建立一个 ELK 堆栈设置,其中每天 JSON 输入存储在创建的日志文件中,每个日期一个。我的 logstash 应通过这些日志侦听输入,并将其存储到 Elasticsearch 中与日志文件条目日期对应的索引处。

我的 logstash-output.conf 是这样的:

output {
  elasticsearch { 
    host => localhost
    cluster => "elasticsearch_prod"
    index => "test"
  }
}

因此,就目前而言,logstash 的所有输入都存储在 elasticsearch 的索引 test 中。我想要的是发生在 2015.11.19 的 logstash 条目,它存储在名为 logstash-2015.11.19.log 的日志文件中,必须相应地存储在索引 test-2015.11.19 中。

我应该如何编辑我的 logstash 配置文件来启用它?

回答,因为评论无法格式化,看起来很糟糕。

您的文件名(我假设您使用文件输入)存储在您的路径变量中:

file {
            path => "/logs/**/*my_log_file*.log"
            }
            type => "myType"
    }

这个变量在你的整个配置中都可以访问,所以你可以做的是使用正则表达式过滤器从路径中解析你的日期,例如使用 grok,你可以做类似的事情(注意:伪代码)

if [type] == "myType" {
   grok {
      match => {
          "path" => "%{MY_DATE_PATTERN:myTimeStampVar}"
      }
   }
}

有了这个,你现在在 "myTimeStampVar" 中有了你的变量,你可以在你的输出中使用它:

elasticsearch {
            host => "127.0.0.1"
            cluster => "logstash"
            index => "events-%{myTimeStampVar}"
        }

说了这么多,我不太清楚你为什么需要这个?我认为最好让 ES 为您完成这项工作。它会知道您日志的时间戳并相应地对其进行索引,以便您可以轻松访问它。但是,上面的设置应该适合您,我使用了一种非常相似的方法来解析客户端名称并在每个客户端的基础上创建子索引,例如:myIndex-%{client}-%{+YYYY.MM.dd}

希望对您有所帮助,

阿图尔

编辑:我做了一些挖掘,因为我怀疑你担心你的日志因为在错误的时间被解析而被放入错误的索引?如果这是正确的,解决方案不是从日志文件中解析出索引,而是从每个日志中解析出时间戳。

我假设您的每个日志行都有一个时间戳。 Logstash 将创建一个 @timestamp 字段,它是当前日期。所以这不等于索引。然而,解决这个问题的正确方法是改变 @timestamp 字段,而不是在日志行(已解析的行)中使用时间戳。这样 logstash 就会有正确的索引并将其放在那里。