【问题标题】:Using Grok filter out UUID from path string and return path使用 Grok 从路径字符串中过滤掉 UUID 并返回路径
【发布时间】:2020-10-31 10:58:30
【问题描述】:

这是我要过滤的日志的示例行:

Request starting HTTP/1.1 GET http://api0.api.sin/api/social/v1/owner/4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf/feeds/notifications/unread/count

我期待的结果如下:

  {
  "message": [
    [
      "Request starting"
    ]
  ],
  "httpversion": [
    [
      "1.1"
    ]
  ],
  "BASE10NUM": [
    [
      "1.1"
    ]
  ],
  "verb": [
    [
      "GET"
    ]
  ],
  "request": [
    [
      "http://api0.api.sin/api/social/v1/owner/feeds/notifications/unread/count"
    ]
  ],
  "uuid": [
    [
      "4b3b60f6-1a54-4fbc-87b5-cc44496a6dbf"
    ]
  ]
}

我尝试使用以下 grok 表达式,但请求返回为 2 个单独的值。

%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request}%{UUID:uuid}%{NOTSPACE:request}

【问题讨论】:

    标签: regex elasticsearch logstash grok logz.io


    【解决方案1】:

    您可以将 UUID 之前和之后的部分捕获到单独的组中,然后您可以将两个值合并到一个字段中:

    grok {
      match => {
        "message" => "%{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} %{NOTSPACE:request1}/%{UUID:uuid}%{NOTSPACE:request2}"
      }
    }
    
    mutate {
      add_field => {
        "request" => "%{request1}%{request2}"
      }
    }
    

    如果您愿意,也可以稍后删除request1request2

    如果你不能使用mutate,你只能想出一个request包含UUID的表达式:

    %{DATA:message}(?: HTTP/%{NUMBER:httpversion}) %{WORD:verb} (?<request>.*?(?<UUID>[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12})\S*)
    

    因为无法将两个不相交的文本字符串匹配到一个捕获组中

    【讨论】:

    • 感谢您的回答,但我正在使用 logzio,我无法访问 logstash 的过滤器,如 mutate,如果可能,我只能使用 grok 来解​​决问题。
    • @NatanGirma 无论如何,您无法将两个不相交的文本字符串匹配到一个捕获组中,因此您被卡住了。您可能应该出具支持票。
    • 好的,谢谢您的建议,我会联系支持团队的。
    • @NatanGirma 我添加了一种解决方法,request 包含 UUID
    • 我对正则表达式很陌生,你认为可以像忽略字符串中的子字符串一样忽略 uuid 部分吗(例如:我在正则表达式中看到你可以删除子字符串来自字符串“abba”的“bb”并捕获“aa”
    猜你喜欢
    • 2022-08-16
    • 2020-11-27
    • 2012-01-12
    • 2018-03-08
    • 2017-07-03
    • 2015-08-30
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多