在字段中存储 Logstash Grok 分解

Store Logstash Grok decomposition in a field

我正在尝试解析日志,其中我有 2 个我想使用 logstash 解析的 URI。

使用此输入(2 个 URI 由 space 分隔):

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

我想获取以下文件:

{
  "source": {
    "URI" : "https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto",
    "URIPROTO" : "https",
    "URIHOST": "www.elastic.co",
    "URIPATHPARAM": "/guide/en/logstash/current/plugins-filters-grok.html?toto",

    ...
  },
  "destination" : {
    "URI" : "https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",
    "URIPROTO" : "https",
    "URIHOST": "github.com",
    "URIPATHPARAM": "/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",

    ...
  }
}

我一直在尝试使用这个 grok 过滤器 :

%{URI:source} %{URI:destination}

但我得到以下结果,其中源和目标信息(URIPROTOURIHOST...)合并到文档根节点的数组中:

{
  "source": [
    "https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto"
    ],
  "URIPROTO": [
    "https",
    "https"
  ],

  ...

  "URIHOST": [
    "www.elastic.co",
    "github.com"
  ],
  "IPORHOST": [
    "www.elastic.co",
    "github.com"
  ],
  "HOSTNAME": [
    "www.elastic.co",
    "github.com"
  ],
  "IP": [
    null,
    null
  ],

  ...

  "destination": [
    "https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns"
  ]
}

有没有人遇到过这种情况并找到了解决办法? 预先感谢您的帮助!

%{URI} 模式不会从 URI 的组件创建任何字段。如果您希望将它们分开(针对一个或两个 URI),您需要制作自己的模式。复制 URI 的定义并添加字段分配给您:

%{URIPROTO:[foo][proto]}://(?:%{USER:[foo][user]}(?::[^@]*)?@)?(?:%{URIHOST:[foo][host]})?(?:%{URIPATHPARAM:[foo][pathparam]})? %{URIPROTO:[bar][proto]}://(?:%{USER:[bar][user]}(?::[^@]*)?@)?(?:%{URIHOST:[bar][host]})?(?:%{URIPATHPARAM:[bar][pathparam]})?

请注意,URIHOST 将创建一个 'port' 字段,对于两个 URI,该字段不会是唯一的。要解决此问题,请将我的模式中的每个 URIHOST 替换为:

 %{IPORHOST}(?::%{POSINT:[myField]})?

为每个 'myField' 使用所需的目的地。