为logstash链接grok过滤器模式

时间:2014-09-24 14:40:32

标签: regex logstash 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模式以从上面的格式中提取某些字段。我在this question尝试提取主机时收到了帮助。因此,如果在grok-patterns我定义

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

然后在logstash conf中指定

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

它按预期工作。我现在遇到的问题是我想指定多个模式,例如M2HOST,M2ADDR等我尝试在相同的grok-patterns文件中定义其他的

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

并更改logstash conf

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

但现在我收到错误_grokparsefailure

1 个答案:

答案 0 :(得分:1)

从其他问题输入您的样本,并猜测完全匹配的值名称:

(?:[^:]*:){2}(?<hostname>[^,]*)[^:]*:(?<address>[^,]*)[^:]*:(?<pid>[^#]*)[^:]*:(?<time>[^#]*)[^:]*:(?<method>[^,]*)[^:]*:(?<query>[^,]*)[^:]*:(?<protocol>[^,]*)[^:]*:(?<code>[^#]*)[^:]*:(?<bytes>[^#]*).*

产:

{
  "hostname": [
    [
      "localhost"
    ]
  ],
  "address": [
    [
      "192.168.33.1"
    ]
  ],
  "pid": [
    [
      "57089"
    ]
  ],
  "time": [
    [
      "1411396297"
    ]
  ],
  "method": [
    [
      "GET"
    ]
  ],
  "query": [
    [
      "/"
    ]
  ],
  "protocol": [
    [
      "HTTP/1.1"
    ]
  ],
  "code": [
    [
      "200"
    ]
  ],
  "bytes": [
    [
      "145978"
    ]
  ]
}