(Logstash, Grok) 如果字段包含特定单词,则从中保存一些字符
(Logstash, Grok) if field contains a specific word, then save some characters from it
我有以下过滤器可以满足我的大部分需求:
筛选 {
grok {
match => { "message" => [ "%{IPORHOST:clientip} - %{NGUSER:user} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) (-|(%{DATA:referrer})) ] }
但是,我正在解析的一些(不是全部)日志包含用户在我的 Apache 服务器上使用的频道的名称。
包含单词"channel"的普通日志是这样的:
10.40.80.11 - alex@example.com [03/Jan/2014:13:08:21 +0000] "GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-01-03 HTTP/1.1" 200 368 "http://example.net/cgi-bin/feed/epg" "Mozilla/5.0"
字段 "rawrequest" 保存在单独的字段中,如下所示:
"GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-04-04 HTTP/1.1"
问题:
考虑到并非所有日志都在字段 "rawrequest" 中包含单词通道,我如何将通道名称保存在单独的字段中?
我看过很多示例,但没有 similar.The 将频道与字符串的其余部分分隔开的字符是“&”。
我将不胜感激任何帮助。
解决方案:
match => { "request" => [ "channel=(?<Channels>[^&]+)" ] }
您现有的 grok 正在创建字段。您可以使用另一个 grok 从 those 字段创建更多字段。像
这样的正则表达式
channel=(?<myField>[^&]+)
应该可以,所以你的 grok 可能看起来像这样(未经测试):
grok {
match => { "request" => [ "channel=(?<myField>[^&]+)" ] }
}
这将使您成为一个名为 'myField' 的新字段。根据需要重命名。
另一种选择是更改您的原始 grok 模式,使用更具体的内置模式而不是 NOTSPACE。检查 URI 模式。不幸的是,该模式不会为您创建字段,因此您必须修改它。如果将 URIPATHPARAM 信息放在另一个字段中,则可以对其使用 kv{} 过滤器并将所有对解析到它们自己的字段中。
很多选项...
我有以下过滤器可以满足我的大部分需求:
筛选 {grok {
match => { "message" => [ "%{IPORHOST:clientip} - %{NGUSER:user} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) (-|(%{DATA:referrer})) ] }
但是,我正在解析的一些(不是全部)日志包含用户在我的 Apache 服务器上使用的频道的名称。
包含单词"channel"的普通日志是这样的:
10.40.80.11 - alex@example.com [03/Jan/2014:13:08:21 +0000] "GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-01-03 HTTP/1.1" 200 368 "http://example.net/cgi-bin/feed/epg" "Mozilla/5.0"
字段 "rawrequest" 保存在单独的字段中,如下所示:
"GET /cgi-bin/feed/epg?channel=Bloomberg%20English&date=2016-04-04 HTTP/1.1"
问题: 考虑到并非所有日志都在字段 "rawrequest" 中包含单词通道,我如何将通道名称保存在单独的字段中?
我看过很多示例,但没有 similar.The 将频道与字符串的其余部分分隔开的字符是“&”。 我将不胜感激任何帮助。
解决方案:
match => { "request" => [ "channel=(?<Channels>[^&]+)" ] }
您现有的 grok 正在创建字段。您可以使用另一个 grok 从 those 字段创建更多字段。像
这样的正则表达式channel=(?<myField>[^&]+)
应该可以,所以你的 grok 可能看起来像这样(未经测试):
grok {
match => { "request" => [ "channel=(?<myField>[^&]+)" ] }
}
这将使您成为一个名为 'myField' 的新字段。根据需要重命名。
另一种选择是更改您的原始 grok 模式,使用更具体的内置模式而不是 NOTSPACE。检查 URI 模式。不幸的是,该模式不会为您创建字段,因此您必须修改它。如果将 URIPATHPARAM 信息放在另一个字段中,则可以对其使用 kv{} 过滤器并将所有对解析到它们自己的字段中。
很多选项...