1

我正在尝试配置 logstash 来管理我的各种日志源,其中之一是 Mongrel2。Mongrel2 使用的格式是tnetstring,其中日志消息将采用以下形式

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

我想编写自己的 grok 模式来从上述格式中提取某些字段。我首先在上面的消息上测试我的正则表达式正则表达式是

^(?:[^:]*\:){2}([^,]*)

这匹配localhost。当我在表单中使用与 grok 模式相同的正则表达式时

TEST ^(?:[^:]*\:){2}([^,]*)
MONGREL %{TEST:test}

并配置logstash

filter {
  grok {
    match => [ "message", "%{MONGREL}" ]
  }
}

相同的正则表达式导致匹配86:9:localhost。我不知道我哪里出错了?是我用来测试的正则表达式引擎是基于 Python 的,但 grok 过滤器正则表达式是基于 Onigurama 的吗?

目前在grokdebug中使用以下输入对其进行测试

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

和以下模式

(?<hostname>^(?:[^:]*\:){2}([^,]*))

导致

{
  "hostname": [
    [
      "86:9:localhost"
    ]
  ]
}

我想要的地方

{
  "hostname": [
    [
      "localhost"
    ]
  ]
}
4

2 回答 2

1

像这样的模式将提取主机名:

^(\d+)?:(\d+)?:(?<hostname>[^,]+),

或者以您已经编写过的类似方式编写它:

^(?:[^:]*\:){2}(?<hostname>[^,]*)

捕获名称需要在您要捕获的括号内......您的模式正在捕获到目前为止的所有内容。

于 2014-09-24T13:59:31.510 回答
1

试试http://grokdebug.herokuapp.com/。这是调试不会导致脱发的 grok 模式的最佳方法。

于 2014-09-24T13:23:48.267 回答