【问题标题】:logstash -> elasticsearch: how can I remove all data before output new datalogstash -> elasticsearch:如何在输出新数据之前删除所有数据
【发布时间】:2018-09-01 15:49:51
【问题描述】:

logstash 每周获取多个事件,然后将这些事件转发给 elasticsearch,

如何配置 logstash 让它告诉 elasticsearch 删除旧事件?

编辑 2018-03-28:

输入:

{host:"host1", type:"packages", records: [{name:"pkg1", ver: "1"}, {name: "pkg2", ver: "2"},...]
{host:"host1", type:"mounts", records: [{path:"path1", dev: "dev1"}, {path:"path2", dev: "dev2"},...]
{host:"host1", type:"???", records: [{???}, {???},...]
...
{host:"host2", type:"packages, records: [{name:"pkg1", version: "1"}, {name: "pkg2", ver: "2"},...]
{host:"host2", type: "mounts", records: [{path:"path1", dev: "dev1"}, {path:"path2", dev: "dev2"},...]
{host:"host2", type:"???", records: [{???}, {???},...]

这是每个主机的各种事件。每个事件都由一组 undeterminable 架构组成。

为了能够精确搜索数组中的字段,我必须将数组拆分为多个elasticsearch文档。

(我知道有一些方法可以不拆分但能够在数组内部搜索。那是另一个故事:Nested Object。在我的情况下,内部对象不是固定模式,所以我不能提供每个内部字段定义事先)

输出:

{host: "host1", type:"packages", record: {name: "pkg1", ver: "1"}}
{host: "host1", type:"packages", record: {name: "pkg2", ver: "2"}}
{host: "host1", type:"mounts", record: {path: "path1", dev: "dev1"}}
{host: "host1", type:"???", record: {???}
{host: "host1", type:"???", record: {???}
{host: "host1", type:"mounts", record: {path: "path2", dev: "dev2"}}
{host: "host2", type:"packages", record: {name: "pkg1", ver: "1"}}
{host: "host2", type:"packages", record: {name: "pkg2", ver: "2"}}
{host: "host2", type:"mounts", record: {path: "path1", dev: "dev1"}}
{host: "host2", type:"mounts", record: {path: "path2", dev: "dev2"}}
{host: "host2", type:"???", record: {???}
{host: "host2", type:"???", record: {???}
...

logstash.conf:

input { ... }

filter {
    split {
      # split array and save them into new multiple events
      field => "records"
    }
    mutate {
      rename => { "records" => "record" }
    }
}

output {
  elasticsearch {
    hosts => ["ELASTIC_IP:PORT"]
    index => "packages-%{+YYYY.MM.dd}"
  }
}

-

问题是:Elasticsearch 会为每种类型的每个主机填充越来越多的旧事件。

所以我想在获得新数据后删除主机的旧数据。

注意一些失败的尝试:

因为输出的是多个文档,而不是单个文档,有时多,有时少,所以不是简单的更新。它必须是全部删除并添加。

我知道有一些方法可以不拆分但能够在数组内搜索。那是另一个故事:Nested Object。就我而言,内部对象不是固定模式,所以我不能事先提供每个内部字段定义

【问题讨论】:

  • 这取决于您的组织,由于您提供的细节很少,我只能给出一个模糊的答案:在 elasticsearch 中使用每日或每周索引,然后使用 curator 删除索引。
  • 或者您可以使用 ES 输入(使用 schedule 设置)检索要删除的事件的 id,然后使用 ES 输出删除它们(操作:删除)
  • @baudsp 谢谢!你的想法很有趣也很有用。我已更新问题以添加详细说明。
  • @baudsp 我正在尝试使用两个弹性搜索输出,一个用于删除索引,另一个用于添加索引。不知道会不会按顺序执行。

标签: elasticsearch logstash


【解决方案1】:

好吧,我已经确认可以通过 ruby​​ 过滤器来删除旧索引。

input { ... }

filter {
  split {
    # split array and save them into new multiple events
    field => "records"
  }
  mutate {
    rename => { "records" => "record" }
  }

  ruby {
    init => "
       require 'net/http'
       require 'uri'
     "
    code => "
      uri = URI.parse('http://docker.for.mac.localhost:19200/inventory-' + event.get('type') + '@' + event.get('host'))
      http = Net::HTTP.new(uri.host, uri.port)
      req = Net::HTTP::Delete.new(uri.request_uri)
      req.basic_auth 'elastic', 'changeme'
      res = http.request(req)
    "
  }
}

output {
  elasticsearch {
    hosts => ["ELASTIC_IP:PORT"]
    index => "inventory-%{type}@%{host}"
  }
}

重要的是为每个主机和类型组合指定索引,以便在删除时轻松定位。

index => "inventory-%{type}@%{host}"

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多