我正在尝试配置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}
并使用
配置logstashfilter {
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"
]
]
}
答案 0 :(得分:1)
尝试http://grokdebug.herokuapp.com/。这是调试不会导致脱发的grok模式的最佳方法。
答案 1 :(得分:1)
这样的模式将提取主机名:
^(\d+)?:(\d+)?:(?<hostname>[^,]+),
或者以与你已经写过的方式类似的方式写作:
^(?:[^:]*\:){2}(?<hostname>[^,]*)
捕获名称需要位于您要捕获的括号内...您的模式正在捕获所有内容。