Logstash / Grok:使用正则表达式从字段读取子字符串

时间:2015-01-16 10:13:16

标签: logstash grok

我试图从logstash中的request_uri字段中提取子字符串。 Grok将我的快速访问日志行分成几个字段(已经工作),所以我在自己的字段中获取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" ]
        }
你能给我一个暗示吗?感谢致敬。塞巴斯蒂安

2 个答案:

答案 0 :(得分:3)

感谢您的帮助。解决了这个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。否则,如果第一个匹配成功,则跳过第二个匹配。

答案 1 :(得分:2)

您的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}\""
  ]
}

然后,在“消息”字段中匹配整个日志消息的那个之后使用第二个grok过滤器:

grok {
  match => ["request_uri", "/(?<context>[^/]+)"]
}