我正在将所有Logstash配置转换为映射到新的ECS 1.0.1标准。在执行此操作时,我想利用[related] [ip]字段添加任何IP地址。如果一个事件在每个字段中仅包含一个IP地址,则可以很好地工作,但是,如果事件在一个字段中包含IP地址数组,则将这些IP地址作为字符串添加到[related] [ip]中,因此无法建立索引。
为了更好地说明...如果发生了事件:
source.ip: "192.168.1.1",
destination.ip: "8.8.8.8"
以下过滤器工作正常:
filter {
if [source][ip] {mutate {copy => {"[source][ip]" => "[related][ip]"}}}
if [destination][ip] {mutate {copy => {"[destination][ip]" => "[related][ip]"}}}
if [host][ip] {mutate {copy => {"[host][ip]" => "[related][ip]"}}}
}
并导致[related] [ip]字段是有效的IP地址数组,并被索引到Elasticsearch:
related.ip: ["192.168.1.1", "8.8.8.8"]
但是,如果某个事件伴随设备上的IP地址阵列(例如,有线和无线)出现:
host.ip: ["192.168.1.1", "192.168.1.200"]
同一过滤器会将两个主机IP作为字符串而不是数组添加,结果如下:
related.ip: ["192.168.1.1,192.168.1.200"]
“ 192.168.1.1,192.168.1.200”不是有效的IP,因此将无法建立索引。
如何在一个字段中检查多个IP地址,并将每个IP地址添加到related.ip?我假设使用Ruby过滤器,但是对Ruby却一无所知。
这是我在Logstash中看到的示例错误:
"Could not index event to Elasticsearch." blah, blah, blah... "failed to parse field [related.ip] of type [ip] in document with id 'JK1Tl2wBOp3Ysey6oX9Z'. Preview of field's value: '169.254.227.113,169.254.128.186'" blah, blah, blah "is not an IP string literal."