【问题标题】:Logstash/Grok: Read substring from field using regexLogstash/Grok:使用正则表达式从字段中读取子字符串
【发布时间】:2019-09-09 23:09:22
【问题描述】:

我正在尝试从 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" ]
        }

你能给我一个提示吗?

【问题讨论】:

  • 这是哪个 Logstash 版本?我从未听说过 grok 过滤器的 pattern 选项。

标签: logstash logstash-grok


【解决方案1】:

感谢您的帮助。用这个与你的建议非常相似的 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。否则,如果第一个匹配成功,则跳过第二个匹配。

【讨论】:

    【解决方案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>[^/]+)"]
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 2010-10-14
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      相关资源
      最近更新 更多