Logstash grok插件,匹配时添加字段

时间:2016-04-21 11:45:26

标签: logstash grok

我有这样的grok比赛:

grok{ match => [ “message”, “Duration: %{NUMBER:duration}”, “Speed: %{NUMBER:speed}” ] }

如果匹配grok模式,我还想为捕获的变量添加另一个字段。我知道我可以使用mutate插件和if-else添加新字段,但是我有太多的匹配,这样会太长。例如,我想捕获给定文本的右侧字段。

"Duration: 12" => [duration: "12", type: "duration_type"]
"Speed: 12" => [speed: "12", type: "speed_type"]

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

我不是100%确定这是否是你需要的,但我做了类似的事情。我对我的消息进行了基本的解析,然后我用可选的匹配分析了一个特定的字段。

grok {
            break_on_match => false
            patterns_dir => "/etc/logstash/conf.d/patterns"
            match => {
                "message" => "\[%{LOGLEVEL:level}\] \[%{IPORHOST:from}\] %{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\] \[%{NOTSPACE:logger}\] %{GREEDYDATA:msg}"
                "thread" => "(%{GREEDYDATA}%{REQUEST_TYPE:reqType}%{SPACE}%{URIPATH:reqPath}(%{URIPARAM:reqParam})?)?"
            }
        }

如您所见,第一个只是匹配完整的消息。我有一个字段线程,基本上是Logger信息。但是,在我的设置中,http请求会向线程名称附加一些信息。在这些情况下,我想选择性地匹配这些。

通过上面的设置,只有线程可以匹配它们才会创建字段reqType,reqPath,reqParam。否则他们不是。

我希望这就是你想要的。

谢谢, 阿图尔

答案 1 :(得分:1)

这样的东西?

filter{
  grok { match =>  [ "message", "%{GREEDYDATA:types}: %{NUMBER:value}" ] }
  mutate {
    lowercase => [ "types" ]
    add_field => { "%{types}" => "%{value}"
                   "type" => "%{types}_type" }
    remove_field => [ "value", "types" ]
  }
}