Logstash:基于文件名的动态字段名称

Logstash: Dynamic field names based on filename

我得到了一个格式为 <key>:<value>-<key>:<value>.log 的文件名,例如pr:64-author:mxinden-platform:aws.log 包含测试日志 运行。

我想通过 logstash 将文件的每一行流式传输到 elasticsearch。每一行都应被视为一个单独的文档。每个文档都应该根据文件名获取字段。所以例如对于上面的示例,假设日志行 17-12-07 foo something happened bar 将获取以下字段:pr 的值为 64author 的值为 mxindenplatform值为 aws.

在我写logstash配置的时间点我不知道字段的名称

如何根据文件名中包含的字段向每一行动态添加字段?

目前的static方法是:

filter {
  mutate { add_field => { "file" => "%{[@metadata][s3][key]}"} }
  else {
    grok { match => { "file" => "pr:%{NUMBER:pr}-" } }
    grok { match => { "file" => "author:%{USERNAME:author}-" } } 
    grok { match => { "file" => "platform:%{USERNAME:platform}-" } }
  }
}

文件名结构的更改没问题。

根据@dan-griffiths 回答我自己的问题:

pr=64,author=mxinden,platform=aws.log 这样的文件的解决方案是使用 Elasticsearch kv filter 例如:

  filter {
    kv {
      source => "file"
      field_split => ","
    }
  }

其中 file 是通过 AWS S3 输入插件从文件名中提取的字段。