首页 文章

Logstash Grok Pattern与Python Regex?

提问于
浏览
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模式以从上面的格式中提取某些字段 . 我开始测试我的正则表达式上面的消息here,正则表达式是

^(?:[^:]*\:){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"
    ]
  ]
}

2 回答

  • 1

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

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

    或者以与您编写的方式类似的方式编写它:

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

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

  • 1

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

相关问题