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" ] } } |