【问题标题】:Logstash Grok Pattern vs Python Regex?Logstash Grok 模式与 Python 正则表达式?
【发布时间】:2014-11-18 17:55:39
【问题描述】:

我正在尝试配置 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"
    ]
  ]
}

【问题讨论】:

    标签: regex logstash mongrel2 logstash-grok


    【解决方案1】:

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

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

    或者用你已经写过的类似方式来写:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对不起,我应该说我正在尝试 grokdebug。我已经相应地更新了我的问题。
      • 感谢您提醒我,我正在失去头发编写logstash grok模式。
      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2010-09-12
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多