在logstash中为已过去的标记分配标记

时间:2016-01-20 16:18:06

标签: elasticsearch syntax logstash kibana-4

我有一个日志文件,例如:

2015-12-05 05:00:51 preffix1_sent 1
2015-12-05 05:00:52 preffix2_sent 2
2015-12-05 05:00:53 preffix1_received 1
2015-12-05 05:00:54 preffix2_received 2

我想知道特定事件花了多少时间。我在logstash中使用经过时间的插件,如下所示:

....

grok {
        patterns_dir => "path"
        match => { 
            "message" => "%{TIMESTAMP:logtime}, %{EVENT:event}, %{SPLIT:ID}"
        }
    }

filter{
    if [event] == "(.)*sent" {
        if [event] == "preffix1(.)*" {
            kv {
                add_tag => [ "preffix1_sent" ]
            }
        } else if [event] == "preffix2(.)*" {
            kv {
                add_tag => [ "preffix2_sent" ]
            }
    } else if [event] == "(.)*received" {
        if [event] == "preffix1(.)*" {
            kv {
                add_tag => [ "preffix1_received" ]
            }
        } else if [event] == "preffix2(.)*" {
            kv {
                add_tag => [ "preffix2_received" ]
            }
        }
    }
}
filter{
    elapsed {
        start_tag => "preffix1_sent"
        end_tag => "preffix1_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}
filter{
    elapsed {
        start_tag => "preffix2_sent"
        end_tag => "preffix2_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}

....

如果我理解" kv"的使用,我不确定我的嵌套if语句的语法是否正确。我是logstash的新手。但是,我无法使用此配置在kibana中找到任何标记。我哪里弄错了? 感谢

1 个答案:

答案 0 :(得分:1)

几条评论:

  • 您的嵌套条件很好。
  • 使用正则表达式进行比较是错误的。 Use "=~"代替" =="。
  • add_tag仅在底层过滤器工作时有效。虽然你使用kv {}会很好,但你实际上并没有用键/值做任何事情,所以它可能会令人困惑。大多数人都会使用mutate {}来做这样的事情。

这些改变可能会让你走上正轨。

对于一些未经请求的建议,请查看您的工作流程。首先,使用grok应用正则表达式来创建三个字段。然后在执行add_field之前再次使用其中一个(2-3次)。试试这个:

  • 在原始的grok {}中,将事件字段分成两部分。像这样的模式应该这样做:%{DATA:event_prefix} _%{DATA:event_verb}
  • 重写您的条件以与这两个字段完全匹配。

不仅更多" grok-ish",而且在应用于大型数据集时会更快。