神交解析问题

grok parsing issue

我有一个如下所示的输入行:

localhost_9999.kafka.server:type=SessionExpireListener,name=ZooKeeperSyncConnectsPerSec.OneMinuteRate

我可以使用这个模式来解析它:

%{DATA:kafka_node}:type=%{DATA:kafka_metric_type},name=%{JAVACLASS:kafka_metric_name}

这给了我这个:

{
  "kafka_node": [
    [
      "localhost_9999.kafka.server"
    ]
  ],
  "kafka_metric_type": [
    [
      "SessionExpireListener"
    ]
  ],
  "kafka_metric_name": [
    [
      "ZooKeeperSyncConnectsPerSec.OneMinuteRate"
    ]
  ]
}

我想将 OneMinuteRate 拆分成一个单独的字段,但似乎无法正常工作。我试过这个:

%{DATA:kafka_node}:type=%{DATA:kafka_metric_type},name=%{WORD:kafka_metric_name}.%{WORD:attr_type}"

但那时一无所获。

我也在使用 https://grokdebug.herokuapp.com/ 来测试这些...

您可以将最后一个正则表达式与转义的 . 一起使用(请注意,. 匹配除换行符之外的任何字符,而 \. 将匹配文字点字符),或者最后一个字段使用 DATA 类型,最后一个字段使用 GREEDYDATA 类型:

%{DATA:kafka_node}:type=%{DATA:kafka_metric_type},name=% {DATA:kafka_metric_name}\.%{GREEDYDATA:attr_type}

由于 %{DATA:name} 转换为 (?<name>.*?)%{GREEDYDATA:name} 转换为 (?<name>.*),因此 name 部分将匹配任何字符,出现 0 次或多次,如尽可能少,直到第一个.attr_type .* 模式将贪婪地"eat up" 剩下的行它的结束。