首页 > 解决方案 > 如何从日志的请求行中过滤值

问题描述

我有以下日志,我只需要从中过滤salePoint

"GET /supero/global/grocery/fullgrainMenu.jsp?id=cat12216&salePoint=0012FT&locale=es_ES&version=0510091431 HTTP/1.1"

我试过\"(%{NOTSPACE:request}(?:&salePoint=%{DATA:salePoint})?)\"但它给出了错误的输出

"salePoint": "0012FT&locale=es_ES&version=0510091431 HTTP/1.1"

预期输出为"salePoint": "0012FT

谢谢

标签: logstash-grokgrok

解决方案


由于问题指定的目的是仅查找和过滤salePoint,您可以使用以下 grok 模式:

(%{GREEDYDATA:before})?(salePoint=%{WORD:salePoint})(%{GREEDYDATA:after})?

说明

  1. before:在找到 salePoint 入口之前存储可选数据。
  2. salePoint : 这存储了 salePoint 值
  3. after:在 salePoint 之后存储可选数据。

与往常一样,如果您需要过滤掉更多字段,您可以使用向模式添加更多内容。


例子 :

"GET /supero/global/grocery/fullgrainMenu.jsp?id=cat12216&salePoint=0012FT&locale=es_ES&version=0510091431 HTTP/1.1"

使用上述模式输出为:

{
  "before": [
    [
      ""GET /supero/global/grocery/fullgrainMenu.jsp?id=cat12216&"
    ]
  ],
  "salePoint": [
    [
      "0012FT"
    ]
  ],
  "after": [
    [
      "&locale=es_ES&version=0510091431 HTTP/1.1""
    ]
  ]
}

请使用Grok Debugger来玩转该模式。


推荐阅读