Logstash - 睡眠直到有特定消息

时间:2017-03-30 06:17:32

标签: logstash sleep

在Logstash中,假设我的日志中有以下几行:

Message: msisdn: 111111111
Message: msisdn: 222222222
Answer: msisdn: 111111111
Answer: msisdn: 222222222

现在,每当我收到消息时,我都要等待X秒。 如果在这段时间内我得到匹配的答案(即使用相同的msisdn),请将其标记为确定,否则将其标记为错误

我该怎么做?

由于

**EDIT**

仙女,我尝试使用聚合过滤器,但没有成功,你可以帮助我吗?

input {
  stdin {}
}

filter {
  grok {
    match => {"message" => "%{GREEDYDATA:type}: msisdn: %{INT:msisdn}"}
  }

  if [type] == "Message" {
    aggregate {
      task_id => "%{msisdn}"
      code => "event.set('result', 'OK')"
      timeout => 5
      timeout_code => "event.set('result', 'error')"
    }
  }

  if [logger] == "Answer" {
    aggregate {
      task_id => "%{msisdn}"
      code => "event.set('result', 'OK')"
      end_of_task => true
    }
  }

  if "_grokparsefailure" in [tags] {
    drop {}
  }

}

output {
  stdout { codec => rubydebug }
} 

将此行写入stdin:

Message: msisdn: 111111111

立即响应(没有等待5秒),状态为OK

{
    "result" => "OK",
    "@timestamp" => 2017-03-30T17:58:39.940Z,
    "@version" => "1",
    "host" => "31634cf481d5",
    "message" => "Message: msisdn: 111111111",
    "type" => "Message",
    "msisdn" => "111111111"
}

我应该以不同的方式书写吗?

非常感谢;)

1 个答案:

答案 0 :(得分:0)

aggregate过滤器几乎可以完成您所描述的内容。首先,您需要确定与消息相关联的task_id。然后设置logstash过滤器,以便获取消息的类型和task_id。然后我们必须分开aggregate个过滤器,第一个用于第二个事件。

第一个有超时和代码,如果超时则将事件设置为错误。第二个过滤器检查Answer消息并结束聚合。

grok {
  match => {%{DATA:type}: %{DATA:name}: %{DATA:id}}
}

if [type] == "Message" {
  aggregate {
    task_id => "%{id}"
    code => "event.set('result', 'OK')"
    timeout => 5
    timeout_code => "event.set('result', 'error')"
  }
}

if [type] == "Answer" {
  aggregate {
    task_id => "%{id}"
    code => "event.set('result', 'OK')"
    end_of_task => true
  }
}

查看aggregate过滤器here的文档。