当事件和logstash输入都提供值时,避免'type'键的冲突

时间:2016-04-06 20:08:52

标签: logstash logstash-configuration

我正在尝试编写一个管道来将文件加载到logstash中。我的设置需要将输入部分中的type字段指定为Run multiple independent logstash config files with input,filter and output。遗憾的是,源数据已包含字段type,并且看起来源数据中的值与输入配置提供的值冲突。

源数据包含一个json数组,如下所示

[
  {"key1":"obj1", "type":"looks like a bad choose for a key name"},
  {"key1":"obj2", "type":"you can say that again"}
]

我的管道如下所示

input {
  exec {
    command => "cat /path/file_containing_above_json_array.txt"
    codec => "json"
    type => "typeSpecifiedInInput"
    interval => 3600
  }
}

output {
  if[type] == "typeSpecifiedInInput" { 
    stdout {
      codec => rubydebug
    }
  }
}

输出永远不会被调用,因为type已设置为源数据提供的值,而不是输入部分提供的值。

如何设置输入管道以避免此冲突?

2 个答案:

答案 0 :(得分:1)

在输入中创建一个新字段,而不是重复使用'type'。 exec {}输入有add_field可用。

答案 1 :(得分:0)

以下是使用add_field代替type的最终渠道。添加了一个过滤阶段以清理文档,以便type字段包含写入ElasticSearch(class of similar documents)所需的预期值。来自原始JSON文档的type值在密钥typeSpecifiedFromDoc中得到保留。必须将mutate步骤分解为单独的阶段,以便替换在原始值之前不会影响type已添加为新字段typeSpecifiedFromDoc

input {
  exec {
    command => "cat /path/file_containing_above_json_array.txt"
    codec => "json"
    add_field => ["msgType", "typeSpecifiedInInput"]
    interval => 3600
  }
}

filter {
  if[msgType] == "typeSpecifiedInInput" {
    mutate {
      add_field => ["typeSpecifiedFromDoc", "%{type}"]
    }
    mutate {
      replace => ["type", "%{msgType}"]
      remove_field => ["msgType"]
    }
  }
}

output {
  if[type] == "typeSpecifiedInInput" { 
    stdout {
      codec => rubydebug
    }
  }
}