Logstash Grok Pattern与Python Regex?

时间:2014-09-24 09:37:13

标签: regex logstash mongrel2 logstash-grok

我正在尝试配置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模式以从上面的格式中提取某些字段。我开始在上面的消息here上测试我的正则表达式,正则表达式是

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

匹配localhost。当我使用相同的正则表达式作为格式

的格鲁克模式
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"
    ]
  ]
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

或者以与你已经写过的方式类似的方式写作:

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

捕获名称需要位于您要捕获的括号内...您的模式正在捕获所有内容。