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

Logstash grok plugin, add field when matched

我有一个像这样的 grok 比赛:

1
grok{ match => [ a€?messagea€?, a€?Duration: %{NUMBER:duration}a€?, a€?Speed: %{NUMBER:speed}a€? ] }

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

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

有没有办法做到这一点?


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

1
2
3
4
5
6
7
8
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})?)?"
            }
        }

如您所见,第一个匹配完整的消息。我有一个字段线程,基本上是记录器信息。但是,在我的设置中,http 请求将一些信息附加到线程名称。在这些情况下,我也想选择匹配这些。

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

我希望这是你想要的。

谢谢,
阿图尔


像这样吗?

1
2
3
4
5
6
7
8
9
filter{
  grok { match =>  ["message","%{GREEDYDATA:types}: %{NUMBER:value}" ] }
  mutate {
    lowercase => ["types" ]
    add_field => {"%{types}" =>"%{value}"
                  "type" =>"%{types}_type" }
    remove_field => ["value","types" ]
  }
}