Logstash/Grok:使用正则表达式从字段中读取子字符串
Logstash/Grok: Read substring from field using regex
我正在尝试从 logstash 中的 request_uri 字段中提取一个子字符串。 Grok 将我的 apace 访问日志行分成几个字段(已经在工作)所以我在它自己的字段中得到 request_uri 。现在我想获取 uri 的根上下文。
/en/some/stuff
/ApplicationName/some/path
/fr/some/french/stuff
但我不知道如何将 en、ApplicationName、fr 存储在自己的字段中(除了其他字段之外)。我在想这样的事情可能会奏效。
grok {
pattern => "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""
match => [ "new_context_field", "SOME-REGEX fo parse request_uri" ]
}
你能给我提示吗?
您的 grok filter 实际上应该是这样的:
grok {
match => [
"message",
"\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""
]
}
然后,在匹配 'message' 字段中的整个日志消息的过滤器之后使用第二个 grok 过滤器:
grok {
match => ["request_uri", "/(?<context>[^/]+)"]
}
感谢您的帮助。使用与您的建议非常相似的 grok 配置解决了这个问题。
grok {
patterns_dir => "/path/to/elk-stack/logstash-1.4.2/bin/custom_patterns"
match => [ "message", "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""]
match => [ "request_uri", "%{CONTEXTFROMURI:context}" ]
break_on_match => false
}
要在单个 grok 块中使用多个匹配项,请确保包含 break_on_match => false
。否则,如果第一个匹配成功,则跳过第二个匹配。
我正在尝试从 logstash 中的 request_uri 字段中提取一个子字符串。 Grok 将我的 apace 访问日志行分成几个字段(已经在工作)所以我在它自己的字段中得到 request_uri 。现在我想获取 uri 的根上下文。
/en/some/stuff
/ApplicationName/some/path
/fr/some/french/stuff
但我不知道如何将 en、ApplicationName、fr 存储在自己的字段中(除了其他字段之外)。我在想这样的事情可能会奏效。
grok {
pattern => "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""
match => [ "new_context_field", "SOME-REGEX fo parse request_uri" ]
}
你能给我提示吗?
您的 grok filter 实际上应该是这样的:
grok {
match => [
"message",
"\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""
]
}
然后,在匹配 'message' 字段中的整个日志消息的过滤器之后使用第二个 grok 过滤器:
grok {
match => ["request_uri", "/(?<context>[^/]+)"]
}
感谢您的帮助。使用与您的建议非常相似的 grok 配置解决了这个问题。
grok {
patterns_dir => "/path/to/elk-stack/logstash-1.4.2/bin/custom_patterns"
match => [ "message", "\"%{GREEDYDATA:domain}\" - %{IP:client_ip} \[%{GREEDYDATA:log_timestamp}\] \"%{WORD:method}\" \"%{GREEDYDATA:request_uri}\" - \"%{GREEDYDATA:query_string}\" - \"%{GREEDYDATA:protocol}\" - %{NUMBER:http_statuscode} %{NUMBER:bytes} \"%{GREEDYDATA:user_agent}\" %{NUMBER:seconds} %{NUMBER:milliseconds} \"%{GREEDYDATA:server_node}\""]
match => [ "request_uri", "%{CONTEXTFROMURI:context}" ]
break_on_match => false
}
要在单个 grok 块中使用多个匹配项,请确保包含 break_on_match => false
。否则,如果第一个匹配成功,则跳过第二个匹配。