regex - 使用Grok从路径字符串中过滤掉UUID并返回路径

标签 regex elasticsearch logstash grok logz.io

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

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}

最佳答案

您可以将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*)
因为不能将两个不相交的文本字符串匹配到一个捕获组中。

关于regex - 使用Grok从路径字符串中过滤掉UUID并返回路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62838726/

相关文章:

javascript - 在逗号分隔值的文本中捕获逗号

regex - 仅在 Django 查询中进行全字匹配

elasticsearch - 查找多个精确值

regex - 如何明智地结合 shingles 和 edgeNgram 来提供灵活的全文搜索?

mongodb - 如何使用logstash将mongodb与elasticsearch连接起来?

elasticsearch - 如何配置filebeat和logstash? 3个虚拟机

java - 正则表达式用于过滤电子邮件、数字和重复输入

regex - 模式属性的 HTML 5 十六进制字符串

elasticsearch - Elasticsearch模板未在Elasticsearch 1.7中创建新索引

logstash - 屏蔽许可证过期后使用Kibana