在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"
}
我应该以不同的方式书写吗?
非常感谢;)
答案 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的文档。