使用logstash-grok,clone和mutate在两个事件中拆分日志条目

时间:2015-01-21 15:21:09

标签: logging logstash logstash-grok

我尝试在我的logstash配置中使用grokmutateclone分割两个事件中的日志。 我的堆栈非常标准ELK(Elasticsearch,Logstash,Kibana)。

我正在创建一个格式如下的日志:

timestamp float integer

例如:

2015/01/19 21:48:12 24.7 32
2015/01/19 22:00:20 24.7 32
2015/01/19 22:01:11 24.7 32
2015/01/19 22:01:58 24.7 28
2015/01/19 22:02:28 23.7 28
(etc ...)

最后,我想在logstash中有两个事件,其中一个事件显然是键timestamptype=sensorAvalue=%{the value of the integer},另一个事件具有相同的时间戳value=%{value of the float}和{{1} }}

到目前为止,我已在type=sensorB中使用此配置:

1.我的输入中的logstash.conf标记了我的日志:

type=sensor

2.然后,我使用grok,clone和mutate来尝试拆分它们

  input {
    file {
      path => "/var/log/sensors.log"
      type => "sensor"
    }
  }

但这并没有真正起作用,因为虽然我得到两个不同类型的事件,但它们都具有相同的值(传感器B的总是如此)。

为什么?我觉得logstash.conf文件并没有以线性方式读取,但我找不到任何解决方案。

任何提示?我错过了一些非常明显的东西吗? 非常感谢

1 个答案:

答案 0 :(得分:2)

您可以使用value插件来执行您需要的操作,而不是使用mutate将值转换为ruby字段。

if [type] == "sensor" {
    # Extracts the values
    grok {
        match => { "message" => "(?<timestamp>%{YEAR}/%{MONTHNUM:month}/%{MONTHDAY:day} %{TIME}) %{NUMBER:sensorA:float} %{NUMBER:sensorB:int}" }
    }
    mutate {
        update => [ "type", "sensorA" ]
    }
    # Clones the event
    clone {
        clones => ["sensorB"]
    }
}
# So now I should have two events,
# one with type sensorA and one with type sensorB, no ? :
ruby {
    code => "
        if event['type'] == 'sensorA'
                event['value'] = event['sensorA']
        elsif event['type'] == 'sensorB'
                event['value'] = event['sensorB']
        end
    "
}

使用此配置,我可以满足您的要求。 希望这可以帮助你:)