grok解析问题

时间:2017-03-16 14:30:39

标签: regex logstash logstash-grok

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

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/来测试这些......

1 个答案:

答案 0 :(得分:1)

您可以将上一个正则表达式与转义DATA一起使用(请注意,GREEDYDATA匹配任何字符但新行和%{DATA:kafka_node}:type=%{DATA:kafka_metric_type},name=% {DATA:kafka_metric_name}\.%{GREEDYDATA:attr_type} 将匹配文字点字符),或使用{ {1}}输入最后一个字段,最后一个字段输入%{DATA:name}

(?<name>.*?)

由于%{GREEDYDATA:name}转换为(?<name>.*)name转换为.attr_type部分将匹配任何字符,0或更多次出现,因为少数,直至第一个.*和{{1}} {{1}}模式将贪婪地#34;吃掉&#34;该行的其余部分一直到最后。