在 logstash 中为 elapsed 分配标签

Assigning tags for elapsed in logstash

我有这样的日志文件:

2015-12-05 05:00:51 prefix1_sent 1
2015-12-05 05:00:52 prefix2_sent 2
2015-12-05 05:00:53 prefix1_received 1
2015-12-05 05:00:54 prefix2_received 2

我想了解特定事件花费了多少时间。我在 logstash 中使用 elapsed 插件是这样的:

....

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

filter{
    if [event] == "(.)*sent" {
        if [event] == "prefix1(.)*" {
            kv {
                add_tag => [ "prefix1_sent" ]
            }
        } else if [event] == "prefix2(.)*" {
            kv {
                add_tag => [ "prefix2_sent" ]
            }
    } else if [event] == "(.)*received" {
        if [event] == "prefix1(.)*" {
            kv {
                add_tag => [ "prefix1_received" ]
            }
        } else if [event] == "prefix2(.)*" {
            kv {
                add_tag => [ "prefix2_received" ]
            }
        }
    }
}
filter{
    elapsed {
        start_tag => "prefix1_sent"
        end_tag => "prefix1_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}
filter{
    elapsed {
        start_tag => "prefix2_sent"
        end_tag => "prefix2_received"
        unique_id_field => "ID"
        new_event_on_match => false
    }
}

....

我不确定我的嵌套 if 语句语法是否正确,我是否理解 "kv" 的用法。我是 logstash 的新手。但是我在 kibana 中找不到任何带有此配置的标签。我哪里出错了?

谢谢

几条评论:

  • 你的嵌套条件没问题。
  • 您使用正则表达式进行的比较是错误的。 Use "=~" 而不是“==”。
  • add_tag 仅在底层过滤器有效时有效。虽然您使用 kv{} 没问题,但您实际上并没有对 key/values 做任何事情,所以它可能会造成混淆。大多数人使用 mutate{} 来做这样的事情。

这些更改可能会让您走上正轨。

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

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

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