【问题标题】:Split a log entry in two events with logstash-grok, clone and mutate使用 logstash-grok、clone 和 mutate 在两个事件中拆分日志条目
【发布时间】:2015-03-20 04:15:06
【问题描述】:

我试图在我的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}type=sensorB

到目前为止,我已经在logstash.conf 中提供了这个配置:

1.我的日志在我的输入中被标记为type=sensor

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

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

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 ? :
if [type] == "sensorA" {
  mutate {
    add_field => { "value" => "%{sensorA}" }
    convert => ["value", "float"]
  }
}
if [type] == "sensorB" {
  mutate {
    add_field => { "value" => "%{sensorB}" }
    convert => ["value", "integer"]
  }
}

但这并没有真正起作用,因为即使我得到两个不同类型的事件,它们都具有相同的值(始终是 sensorB 的值)。

怎么会?我感觉 logstash.conf 文件并没有真正以线性方式读取,但我找不到任何解决方案。

有什么提示吗?我在这里错过了一些非常明显的东西吗? 非常感谢

【问题讨论】:

    标签: logging logstash logstash-grok


    【解决方案1】:

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

    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
        "
    }
    

    有了这个配置,我可以满足你的要求。 希望这可以帮助你:)

    【讨论】:

    • 是的,它可以这样工作,但我仍然不明白为什么使用mutate 不起作用;它——我认为——完全等价,所以它应该......
    • 我相信 mutate-update 应该使用 =&gt; 而不是两个元素数组。 elastic.co/guide/en/logstash/current/…
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多